Java反射机制的基本用法

2014-11-24 10:36:41 · 作者: · 浏览: 0

1、获取一个Class对象


Class c = this.getClass();//


ReflectImplement r = new ReflectImplement();//通过类实例获得


Class c1 = r.getClass();


Class subClass = c1.getSuperclass();//通过类实例获得父类对象


Class c2 = ReflectImplement.class;//通过类名.class获得


Class c3 = Class.forName("ReflectImplement");//通过类名字符串获得



2、获得类名称


c1.getName();



3、修饰符Modifier


Modifier.toString(c2.getModifiers())//类的修饰符


Field[] fields1 = c2.getDeclaredFields();//该方法访问


Modifier.toString(field1[0].getModifiers())



4、检索类接口


Class [] inf = c2.getInterfaces();




5、检索类所有成员



Field[] fields = c2.getFields();//该方法只能访问公共变量


for(int i = 0; i < fields.length; i++)


{


String str = fields[i].getName() + "" + fields[i].getType().getName();


}



Field[] fields1 = c2.getDeclaredFields();//该方法访问所有变量



6、检索类的构造函数



Constructor[] constructor = c1.getDeclaredConstructors();


for(int i = 0; i < constructor.length; i++)


{


Constructor cstr = constructor[i];


System.out.print("\n" + cstr.getName());


System.out.print("\n" + cstr.getDeclaringClass());


Class[] cp = cstr.getParameterTypes();


for(int j = 0; j < cp.length; j++)


{


System.out.print("\n" + cp[j]);


}


}



7、检索类的方法



Method [] methods = c1.getDeclaredMethods();


for(int i = 0; i < methods.length; i++)


{


Method method = methods[i];


Class cp[] = method.getParameterTypes();//该方法对应的参数类型


method.getExceptionTypes();


}






-------------------------------------------高级用法案例---------------------------------------


1. 得到某个对象的属性-


/*


OWNER 是一个类实例 A a。


*/


public Object getProperty(Object owner, String fieldName)
{
Class< > class1 = owner.getClass();
Field[] fields = class1.getFields();//遍历所有的属性(public)
for(int i = 0; i < fields.length; i++)
{
System.out.print(fields[i].getName());
}



Field field = class1.getField(fieldName);//通过Class得到类声明的属性。
Object object = field.get(owner);//通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException。
System.out.print(object);
}
return null;
}



/*


rest是一个类实例 B b


*/


public boolean isValidate(Restaurant(one class) rest) {
Class< > clazz = rest.getClass();
Field[] fields = clazz.getFields();
for (Field field : fields) {
try {
Object object = field.get(rest);
if (object == null) {
System.out.println(field.getName() + "-->is null");
return false;
}
} catch (Exception e) {
e.printStackTrace();
}
}
return true;
}



得到类的静态属性



public Object getStaticProperty(Object owner, String fieldName)
{
Class< > class1 = owner.getClass();
Field field = class1.getField(fieldName);//该属性是静态的,所以直接从类的Class里取
Object object = field.get(class1);
return null;
}



//执行某对象的方法


public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception
{
Class< > ownerClass = owner.getClass();
Class< >[] argsClass = new Class[args.length];
for(int i = 0, j = args.length; i < j; i++)
{
argsClass[i] = args[i].getClass();
}
Method method = ownerClass.getMethod(methodName, argsClass);//查找匹配的方法
return method.invoke(owner, args);


return method.invoke(null, args);//如果是静态方法,则用NULL,因不需要借助实例对象
}





//新建实例对象


Class newoneClass= Class.forName(className);


Class[] argsClass= new Class[args.length];


for (int i = 0, j= args.length; i< j; i++) {


argsClass[i]= args[i].getClass();


}


Constructor cons = newoneClass.getConstructor(argsClass);
return cons.newInstance(args); //新建实例。


如果不需要参数,可以直接使用newoneClass.newInstance()来实现。