反射机制用来探查java对象得属性
获取Class的3种方法
package reflection;
public class Testreflection {
public static void main(String[] args) {
Object person = new Person("xiaoming",22);
Class c1 = person.getClass(); //获得class方法得第一种方法
System.out.println(c1.getName());//reflection.Person
System.out.println(c1.getClass().getName()); //java.lang.Class
Class c2 = Person.class; //获取class对象得第二种方法 T.class,T为任意得java关键字
System.out.println(c2.getName());//reflection.Person
Class c3 = int.class;
System.out.println(c3.getName()); //int
String className = "java.lang.String";
try {
Class c4 = Class.forName(className);
System.out.println(c4.getName()); //获取Class得第三种方法
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Person{
private String name;
private int age;
public Person() {
this.name = "sample";
this.age = 0;
}
public Person(String name,int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
利用Class创建一个类
try {
Person p1 = (Person) c1.newInstance();
System.out.println(p1.getName()); //sample
} catch (InstantiationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IllegalAccessException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
利用反射分析类的能力
//c4 = Class.forName(className); 得到String的修饰符
//c4.getModifiers()是一个数字,Modifier.toString()用来解析该数字
System.out.println(Modifier.toString(c4.getModifiers()));//public final
还可以在分析类的域,方法,构造器,及他们的参数,返回值类型,修饰符(如果有的话),类的父类。不一一列举了。
利用反射机制操作对象
查看私有变量和修改私有变量的值
//访问私有变量
Field f = c1.getDeclaredField("name");
//name为私有变量,为f赋予权限
f.setAccessible(true);
String fname = (String) f.get(person);
System.out.println(fname);//xiaogming
//修改私有变量
f.set(person,"xiaohong");
System.out.println(person.getName());//小红
利用反射机制调用任意方法
Method m = c1.getMethod("getName");
String gname = (String) m.invoke(person);
System.out.println(gname);//xiaohong
反射对于编写系统程序来说及其实用,但是通常不适合编写应用程序。反射比较脆弱