org.eclipse.jetty.util.IntrospectionUtil Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of ehcache Show documentation
Show all versions of ehcache Show documentation
Ehcache is an open source, standards-based cache used to boost performance,
offload the database and simplify scalability. Ehcache is robust, proven and full-featured and
this has made it the most widely-used Java-based cache.
//
// ========================================================================
// Copyright (c) 1995-2012 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.util;
import java.lang.reflect.Field;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.List;
/**
* IntrospectionUtil
*
*
*/
public class IntrospectionUtil
{
public static boolean isJavaBeanCompliantSetter (Method method)
{
if (method == null)
return false;
if (method.getReturnType() != Void.TYPE)
return false;
if (!method.getName().startsWith("set"))
return false;
if (method.getParameterTypes().length != 1)
return false;
return true;
}
public static Method findMethod (Class> clazz, String methodName, Class>[] args, boolean checkInheritance, boolean strictArgs)
throws NoSuchMethodException
{
if (clazz == null)
throw new NoSuchMethodException("No class");
if (methodName==null || methodName.trim().equals(""))
throw new NoSuchMethodException("No method name");
Method method = null;
Method[] methods = clazz.getDeclaredMethods();
for (int i=0;i clazz, String targetName, Class> targetType, boolean checkInheritance, boolean strictType)
throws NoSuchFieldException
{
if (clazz == null)
throw new NoSuchFieldException("No class");
if (targetName==null)
throw new NoSuchFieldException("No field name");
try
{
Field field = clazz.getDeclaredField(targetName);
if (strictType)
{
if (field.getType().equals(targetType))
return field;
}
else
{
if (field.getType().isAssignableFrom(targetType))
return field;
}
if (checkInheritance)
{
return findInheritedField(clazz.getPackage(), clazz.getSuperclass(), targetName, targetType, strictType);
}
else
throw new NoSuchFieldException("No field with name "+targetName+" in class "+clazz.getName()+" of type "+targetType);
}
catch (NoSuchFieldException e)
{
return findInheritedField(clazz.getPackage(),clazz.getSuperclass(), targetName,targetType,strictType);
}
}
public static boolean isInheritable (Package pack, Member member)
{
if (pack==null)
return false;
if (member==null)
return false;
int modifiers = member.getModifiers();
if (Modifier.isPublic(modifiers))
return true;
if (Modifier.isProtected(modifiers))
return true;
if (!Modifier.isPrivate(modifiers) && pack.equals(member.getDeclaringClass().getPackage()))
return true;
return false;
}
public static boolean checkParams (Class>[] formalParams, Class>[] actualParams, boolean strict)
{
if (formalParams==null)
return actualParams==null;
if (actualParams==null)
return false;
if (formalParams.length!=actualParams.length)
return false;
if (formalParams.length==0)
return true;
int j=0;
if (strict)
{
while (j> parameterTypesA = Arrays.asList(methodA.getParameterTypes());
List> parameterTypesB = Arrays.asList(methodB.getParameterTypes());
if (methodA.getName().equals(methodB.getName())
&&
parameterTypesA.containsAll(parameterTypesB))
return true;
return false;
}
public static boolean isTypeCompatible (Class> formalType, Class> actualType, boolean strict)
{
if (formalType==null)
return actualType==null;
if (actualType==null)
return false;
if (strict)
return formalType.equals(actualType);
else
return formalType.isAssignableFrom(actualType);
}
public static boolean containsSameMethodSignature (Method method, Class> c, boolean checkPackage)
{
if (checkPackage)
{
if (!c.getPackage().equals(method.getDeclaringClass().getPackage()))
return false;
}
boolean samesig = false;
Method[] methods = c.getDeclaredMethods();
for (int i=0; i c, boolean checkPackage)
{
if (checkPackage)
{
if (!c.getPackage().equals(field.getDeclaringClass().getPackage()))
return false;
}
boolean sameName = false;
Field[] fields = c.getDeclaredFields();
for (int i=0;i clazz, String methodName, Class>[] args, boolean strictArgs)
throws NoSuchMethodException
{
if (clazz==null)
throw new NoSuchMethodException("No class");
if (methodName==null)
throw new NoSuchMethodException("No method name");
Method method = null;
Method[] methods = clazz.getDeclaredMethods();
for (int i=0;i clazz, String fieldName, Class> fieldType, boolean strictType)
throws NoSuchFieldException
{
if (clazz==null)
throw new NoSuchFieldException ("No class");
if (fieldName==null)
throw new NoSuchFieldException ("No field name");
try
{
Field field = clazz.getDeclaredField(fieldName);
if (isInheritable(pack, field) && isTypeCompatible(fieldType, field.getType(), strictType))
return field;
else
return findInheritedField(clazz.getPackage(), clazz.getSuperclass(),fieldName, fieldType, strictType);
}
catch (NoSuchFieldException e)
{
return findInheritedField(clazz.getPackage(), clazz.getSuperclass(),fieldName, fieldType, strictType);
}
}
}