JAVA反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
直接贴代码加注释吧!
package demo.reflect.a;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectionDemoMain {
public static void main(String[] args) throws InstantiationException, IllegalAccessException
{
try {
//根据类全称获取类
Class demoClass = Class.forName("demo.reflect.b.ReflectionDemo");
//获取类的一个实例对象。
Object obj = demoClass.newInstance();
/*Field 可以查看API看看都有什么方法。*/
//遍历成员变量--这里看看能访问私有变量么?
Field [] fieldArray = demoClass.getDeclaredFields();
for(int i=0; i < fieldArray.length; i++)
{
//打印变量的类型
System.out.println(fieldArray[i].getType());
//打印变量的名称
System.out.println(fieldArray[i].getName());
//打印变量的值,如果是私有变量这会抛出错误的
/**
Exception in thread "main" java.lang.IllegalAccessException: Class demo.reflect.a.ReflectionDemoMain can not access a member of class demo.reflect.b.ReflectionDemo with modifiers "private"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
at java.lang.reflect.Field.doSecurityCheck(Field.java:954)
at java.lang.reflect.Field.getFieldAccessor(Field.java:895)
at java.lang.reflect.Field.get(Field.java:357)
at demo.reflect.a.ReflectionDemoMain.main(ReflectionDemoMain.java:26)
*/
// System.out.println(fieldArray[i].get(obj));
// 它是利用的Field对象本身操作获取对应对象里变量的值,如果获取的其他类的实例里相同变量会有问题么?
// 也是会抛出异常的,可能有类的全称做标示吧。
/**
Exception in thread "main" java.lang.IllegalArgumentException
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:37)
at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:18)
at java.lang.reflect.Field.get(Field.java:357)
at demo.reflect.a.ReflectionDemoMain.main(ReflectionDemoMain.java:40)
*/
// CopyOfReflectionDemoMain obj2 = new CopyOfReflectionDemoMain();
// System.out.println(fieldArray[i].get(obj2));
}
/*
* 遍历函数名称
* 其他也详见API中Method
*/
Method [] methods = demoClass.getMethods();
for(int i=0; i < methods.length; i++)
{
System.out.println("Method Name :[" +i+"]"+methods[i].getName());
}
/*
* 调用函数
* private函数就别试了,肯定跟私有变量一个下场,就不试了。
* 如果参数包含多个就用Class数组一个个设置上传进去就可以
*/
//参数类型设置
Class [] paraTypes = {String.class};
try {
//获取方法
Method method = demoClass.getMethod("UpString", paraTypes);
String [] arg = {"test"};
//调用方法
String result = (String)method.invoke(obj, arg);
System.out.println("Result " + result);
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package demo.reflect.b;
/**
* 试试反射的常用功能
* @author zmy
*
*/
public class ReflectionDemo {
//public 成员变量
public String member1 = "public value1";
//private成员变量
private static String member2 = "parivet value2";
public ReflectionDemo()
{
member1 = "construction value1";
}
/**
* private函数,想试试利用反射能否调用其他私有函数
*/
private void printMember2()
{
System.out.println(member1);
}
/**
* 试试参数传递怎么用
* @param p
* @return
*/
public String UpString(String p)
{
return p.toUpperCase();
}
}