您的位置:首页 > 其它

反射原理及使用

2016-03-30 11:32 281 查看
反射原理:

         >保存java文件到本地硬盘.java

         >.java文件编译变成.class文件

         >使用类加载器(jvm)将.class文件加载到内存中,用Class表示

         >通过反射,得到Class类,就得到了类中的所有内容(属性、构造方法、普通方法)

属性用Field类表示,构造方法有Constructor方法表示,普通方法用Method类表示

使用反射得到Class类的三种方式:

        >类名.class

        >对象.getClass()

        >Class.forName("路径");

第三种最常用

package demo;

public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}

public static void show(){
System.out.println("Person.");
}

}


eg.获取一个类的实例化,不使用new,怎么得到?
public void fun1() throws Exception{
Class c1=Class.forName("demo.Person");
Person p1=(Person)c1.newInstance(); //调用无参构造方法
p1.setName("lisi");
System.out.println(p1.getName());
}
通过反射操作有参构造方法

public void fun2() throws Exception{
Class c2=Class.forName("demo.Person");
Constructor cs=c2.getConstructor(String.class,int.class);
Person p2=(Person)cs.newInstance("xiaoming",18);
System.out.println(p2.getName()+" "+p2.getAge());
}

通过反射操作属性
public void fun3() {
try {
Class c3 = Class.forName("demo.Person");
Person p3=(Person)c3.newInstance();
Field f1=c3.getDeclaredField("name");
//如果操作的是私有属性,要进行以下设置
f1.setAccessible(true);
f1.set(p3, "lisi");
System.out.println(f1.get(p3));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

通过反射操作普通方法
public void fun4() throws Exception{
Class c4 = Class.forName("demo.Person");
Person p4=(Person)c4.newInstance();
//第一个参数是方法名,第二个参数是方法中参数类型
Method m=c4.getDeclaredMethod("setName", String.class);
m.invoke(p4, "wangwu");
System.out.println(p4.getName());
}

反射操作静态方法时,invoke的第一个参数是null
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: