Java反射
1) 根据一个字符串反射获取一个类的对象
2)反射获取成员变量
3)反射泛型
4)反射进行封装
项目地址:https://github.com/xiongliang120/ReflectProject.git
获取类型:
ClassForName:
Class temp = Class.forName("com.xiongliang.reflectionproject.reflect.Test");
Class属性:
Class temp2 = Test.class;
TYPE属性:
Class temp = Boolean.TYPE
调用构造函数:
Class[] p1 = {int.class};
Constructor c2 = temp.getDeclaredConstructor(p1);
c2.setAccessible(true); //private 需要设置权限
Object object2 = c2.newInstance(2);
调用实例方法:
Class[] p1 = {String.class};
Method method = temp.getDeclaredMethod("callPrivateMethod",p1);
method.setAccessible(true);
Object argList[] = {"test"};
Object result = method.invoke(object,argList);
调用静态实例方法:
Class[] p1 = {String.class};
Method method = temp.getDeclaredMethod("callPrivateStaticMethod",p1);
method.setAccessible(true);
Object argList[] = {"test"};
Object result = method.invoke(null,argList);
获取泛型变量:
public class SingleTon<T> {
private T mInstance;
public void setSingleTon(T t){
mInstance = t;
}
}
SingleTon singleTon = new SingleTon();
singleTon.setSingleTon(new Test());
Class<?> instance = Class.forName("com.xiongliang.reflectionproject.reflect.SingleTon");
Field mInstanceFieldId = instance.getDeclaredField("mInstance");
mInstanceFieldId.setAccessible(true);
Object fieldObject = mInstanceFieldId.get(singleTon);
反射封装:
public class ReflectUtil {
/**
* 反射构造函数
* @param className
* @param paraType
* @param paraValues
* @return
*/
public static Object createObject(String className,Class[] paraType,Object[] paraValues){
try{
Class temp = Class.forName(className);
Constructor c2 = temp.getDeclaredConstructor(paraType);
c2.setAccessible(true);
Object object = c2.newInstance(paraValues);
return object;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
/**
* 反射调用实例方法
* @param obj
* @param methodName
* @param paraType
* @param paraValues
* @return
*/
public static Object invokeInstanceMethod(Object obj,String methodName,Class[] paraType, Object[] paraValues){
try{
if(obj != null){
Method method = obj.getClass().getDeclaredMethod(methodName,paraType); //在指定类中获取指定的方法
method.setAccessible(true);
Object result = method.invoke(obj,paraValues);
return result;
}
}catch (Exception e){
e.printStackTrace();
}
return null;
}
/***
* 反射调用静态方法
* @param className
* @param methodName
* @param paramType
* @param paraValues
* @return
*/
public static Object invokeStaticMethod(String className,String methodName,Class[] paramType,Object[] paraValues){
try{
Class temp = Class.forName(className);
Method method = temp.getDeclaredMethod(methodName,paramType);
method.setAccessible(true);
Object result = method.invoke(null,paraValues);
return result;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
/**
* 反射获取实例字段
* @param className
* @param obj
* @param fieldName
* @return
*/
public static Object getFieldObject(String className,Object obj,String fieldName){
try{
Class temp = Class.forName(className);
Field field = temp.getDeclaredField(fieldName);
field.setAccessible(true);
Object fieldObject = field.get(obj);
return fieldObject;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
/**
* 反射获取静态字段
* @param className
* @param fieldName
* @return
*/
public static Object getStaticFieldObject(String className,String fieldName){
return getFieldObject(className,null,fieldName);
}
/**
* 反射设置实例字段值
* @param className
* @param obj
* @param fieldName
* @param fieldValue
*/
public static void setFileObject(String className,Object obj,String fieldName,String fieldValue){
try{
Class temp = Class.forName(className);
Field field = temp.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(obj,fieldValue);
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 反射设置静态字段值
* @param className
* @param fieldName
* @param fieldValue
*/
public static void setStaticFieldObject(String className,String fieldName,String fieldValue){
setFileObject(className,null,fieldName,fieldValue);
}