参考网址:
http://my.oschina.net/u/1407116/blog/209417
http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html
在此之前需了解的背景知识:
Class类:
Class的实例表示正在运行的类和接口,基本的数据类型(boolean, byte, char, short, int, long, float, double)以及void也比表示Class对象。
Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。(不能直接new出来)
重要方法:
newInstance():创建此Class对象所表示的类的一个对象并返回。
只能使用在默认的构造方法中。一定要自己定义无参的构造函数。
getName():以String的形式返回此Class对象所表示的实体(类、接口、数组类、基本类型或void)名称。
forName():返回与带有给定字符串名的类或接口相关联的Class对象,Class的静态方法。
代码:
//直接将People类赋值
Class<?> demo1 = People.class;
//调用Class的静态方法forName,返回一个People,即Class的对象
Class<?> demo2 = Class.forName("www.baidu.com.People");
//通过实例的getClass()方法获取类,赋值给Class
People people = new People();
Class<?> demo3 = people.getClass();
People mPeople = null;
mPeople = (People)demo1.newInstance();
Class<People> demo4 = People.class;
People people2 = null;
people2 = demo4.newInstance();
//demo4中应用了泛型。
这边比较乱,画了个图:
反射机制:
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
反射使用:
Method是反射最基本的一个类。
getMethod(String name, Class<T>…parameterTypes):返回一个Method对象,它反映此Class对象所表示的类或接口的指定公共成员方法。
invoke(Object obj, Object… agrs):
对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
代码:
Method method[] = demo4.getMethods();
System.out.println(method[0]);
System.out.println(method[1]);
输出: public java.lang.String www.baidu.com.People.getAge()
public void www.baidu.com.People.setAge(java.lang.String)
Method myMethod = demo4.getMethod("sayHi");
myMethod.invoke(demo4.newInstance());
输出:
HelloWorld!