反射的基础

总结:反射是通过配置文件,找到配置文件里面的路径,通过路径找到对应的类,然后就可以操作类中的Field(属性)、Method(方法)、Constructor(构造方法)等
①反射概念:
java反射机制,是在运行状态中,对于任何一个类,都能够访问这个类的所有属性和方法,同时任何一个对象也都能够调用它的任意一个方法和属性,这个功能称为java语言的反射机制。
②反射的原理:
1、java文件保存到本地磁盘中, XXX.java
2、编译java文件 成XXX.class文件
3、使用jvm,把class文件通过类加载到内存中
4、万物皆对象,class文件在内存中都用Class类来表示
如果得到了Class类,那么可以得到类里面的所有内容。
一个类包括:
1、类的属性 Field
2、构造方法 Constructor
3、普通方法。Method
使用放射首先要得到Class类
三种方式:
1、类名.class
2、对象.getClass()
3、使用Class.forName("路径")

package reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

import org.junit.Test;

public class Testt {
/*public static void main(String[] args) throws Exception {
Class c1 = erson.class;
Class c2 = new erson().getClass();
Class c3 = Class.forName("reflect.erson");

}*/
//无参数的构造方法
@Test
public void test1() throws Exception{
//得到class类
Class c4 = Class.forName("reflect.erson");
//得到erson实例
erson e1 = (erson) c4.newInstance();
//设置值
e1.setName("hubotao");
System.out.println(e1.getName());
}
//操作有参数的构造方法
@Test
public void test2() throws Exception {
//得到Class
Class c5 = Class.forName("reflect.erson");
//使用有参的构造方法
//传递的是有参数的构造方法里面参数类型 类型使用class形式传递
Constructor cs = c5.getConstructor(String.class,String.class);
//得到erson实例
erson e1 = (erson) cs.newInstance("hubotao","100");
System.out.println(e1.getName()+" "+e1.getNo());
}
//操作对象
@Test
public void test3() throws Exception {
//得到Class
Class c5 = Class.forName("reflect.erson");
//得到erson实例
erson e1 = (erson) c5.newInstance();
Field f1 = c5.getDeclaredField("name");
//如果没有这一句 它不可以为private属性的name设置值 有了这个之后就可以了
f1.setAccessible(true);
f1.set(e1, "hubotao1");
System.out.println(f1.get(e1));
}
//反射操作方法
@Test
public void test4() throws Exception {
//得到Class
Class c4 = Class.forName("reflect.erson");
//得到erson实例
erson e1 = (erson) c4.newInstance();
//得到普通方法
Method m1 = c4.getDeclaredMethod("setName", String.class);
//让setName方法执行,执行设置值
//参数一:类的实例 参数二:设置的值
m1.invoke(e1, "testhubotao");
//测试
System.out.println(e1.getName());
}

}

posted @ 2017-10-30 16:08  ChangeAllTheTime  阅读(104)  评论(0)    收藏  举报