反射详解
来源:互联网 发布:猛兽录音软件 编辑:程序博客网 时间:2024/06/05 19:12
1.反射的原理(********理解********)
* 应用在一些通用性比较高的代码 中* 后面学到的框架,大多数都是使用反射来实现的
* 在框架开发中,都是基于配置文件开发
** 在配置文件中配置了类,可以通过反射得到类中的 所有内容,可以让类中的某个方法来执行
* 类中的所有内容:属性、没有参数的构造方法、有参数的构造方法、普通方法
* 画图分析反射的原理
* 首先需要把java文件保存到本地硬盘 .java
* 编译java文件,成.class文件
* 使用jvm,把class文件通过类加载加载到内存中
* 万事万物都是对象,class文件在内存中使用Class类表示
* 当使用反射时候,首先需要获取到Class类,得到了这个类之后,就可以得到class文件里面的所有内容
- 包含属性 构造方法 普通方法
* 属性通过一个类 Filed
* 构造方法通过一个类 Constructor
* 普通方法通过一个类 Method
2.Person.java
package cn.itcast.test09;public class Person {//属性private String name;private String id;//没有参数的构造方法public Person() {}//有参数的构造public Person(String name, String id) {this.name = name;this.id = id;} //普通方法public String getName() {return name;}public void setName(String name) {this.name = name;}public String getId() {return id;}public void setId(String id) {this.id = id;}}TestDemo1.java
package cn.itcast.test09;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;import org.junit.Test;public class TestDemo1 {/** * @param args * @throws Exception */public static void main(String[] args) throws Exception {// 获取Class类Class clazz1 = Person.class;Class clazz2 = new Person().getClass();Class clazz3 = Class.forName("cn.itcast.test09.Person");}//操作普通方法 ,比如操作 setName@Testpublic void test4() throws Exception {//得到Class类Class c4 = Class.forName("cn.itcast.test09.Person");//得到Person实例Person p4 = (Person) c4.newInstance();//得到普通方法//c4.getDeclaredMethods();//得到所有的普通方法Method m1 = c4.getDeclaredMethod("setName", String.class);//操作的私有的方法 ,需要设置值是true//m1.setAccessible(true);//让setName方法执行 ,执行设置值m1.invoke(p4, "niuqi");System.out.println(p4.getName());}//操作name属性@Testpublic void test3() {try {//得到Class类Class c2 = Class.forName("cn.itcast.test09.Person");//得到name属性//c2.getDeclaredFields();//表示得到所有的属性//得到Person类的实例Person p11 = (Person) c2.newInstance();Field f1 = c2.getDeclaredField("name");//设置可以操作私有属性f1.setAccessible(true);//设置name值f1.set(p11, "wangwu"); //相当于 在 p.name = "wangwu";System.out.println(f1.get(p11)); //相当于 p.name}catch(Exception e) {e.printStackTrace();}}//操作有参数的构造方法@Testpublic void test2() throws Exception {//得到ClassClass c1 = Class.forName("cn.itcast.test09.Person");//使用有参数的构造方法//c1.getConstructors();//获取所有的构造方法//传递是有参数的构造方法里面参数类型,类型使用class形式传递Constructor cs = c1.getConstructor(String.class,String.class);//通过有参数的构造方法设置值//通过有参数的构造方法创建Person实例Person p1 = (Person) cs.newInstance("lisi","100");System.out.println(p1.getId()+" "+p1.getName());}//操作无参数的构造方法@Testpublic void test1() throws Exception {//得到ClassClass c3 = Class.forName("cn.itcast.test09.Person");//得到Person类的实例Person p = (Person) c3.newInstance();//设置值p.setName("zhangsan");System.out.println(p.getName());}}
3、使用反射操作类里面的无参数的构造方法(**会写**)
* 首先获取到Class类
- // 获取Class类
Class clazz1 = Person.class;
Class clazz2 = new Person().getClass();
Class clazz3 = Class.forName("cn.itcast.test09.Person");
* 比如: 要对一个类进行实例化,可以new,不使用new,怎么获取?
- //得到Class
Class c3 = Class.forName("cn.itcast.test09.Person");
//得到Person类的实例
Person p = (Person) c3.newInstance();
* 代码
//操作无参数的构造方法
@Test
public void test1() throws Exception {
//得到Class
Class c3 = Class.forName("cn.itcast.test09.Person");
//得到Person类的实例
Person p = (Person) c3.newInstance();
//设置值
p.setName("zhangsan");
System.out.println(p.getName());
}
4、使用反射操作有参数的构造方法(**会写**)
//操作有参数的构造方法
@Test
public void test2() throws Exception {
//得到Class
Class c1 = Class.forName("cn.itcast.test09.Person");
//使用有参数的构造方法
//c1.getConstructors();//获取所有的构造方法
//传递是有参数的构造方法里面参数类型,类型使用class形式传递
Constructor cs = c1.getConstructor(String.class,String.class);
//通过有参数的构造方法设置值
//通过有参数的构造方法创建Person实例
Person p1 = (Person) cs.newInstance("lisi","100");
System.out.println(p1.getId()+" "+p1.getName());
}
5、使用反射操作属性(**会写**)
* //操作name属性
@Test
public void test3() {
try {
//得到Class类
Class c2 = Class.forName("cn.itcast.test09.Person");
//得到name属性
//c2.getDeclaredFields();//表示得到所有的属性
//得到Person类的实例
Person p11 = (Person) c2.newInstance();
//通过这个方法得到属性,参数是属性的名称
Field f1 = c2.getDeclaredField("name");
//操作的是私有的属性,不让操作,需要设置可以操作私有属性setAccessible(true),可以操作私有属性
f1.setAccessible(true);
//设置name值 set方法,两个参数:第一个参数类的实例,第二个参数是设置的值
f1.set(p11, "wangwu"); //相当于 在 p.name = "wangwu";
System.out.println(f1.get(p11)); //相当于 p.name
}catch(Exception e) {
e.printStackTrace();
}
}
6、使用反射操作普通方法(**会写**)
* 使用Method类表示普通方法
* 代码
//操作普通方法 ,比如操作 setName
@Test
public void test4() throws Exception {
//得到Class类
Class c4 = Class.forName("cn.itcast.test09.Person");
//得到Person实例
Person p4 = (Person) c4.newInstance();
//得到普通方法
//c4.getDeclaredMethods();//得到所有的普通方法
//传递两个参数:第一个参数,方法名称;第二个参数,方法里面参数的类型
Method m1 = c4.getDeclaredMethod("setName", String.class);
//让setName方法执行 ,执行设置值
//使用invoke(p4, "niuqi");传递两个参数:第一个参数,person实例;第二个参数,设置的值
//执行了invoke方法之后,相当于,执行了setName方法,同时通过这个方法设置了一个值是niuqi
m1.invoke(p4, "niuqi");
System.out.println(p4.getName());
}
* //操作的私有的方法 ,需要设置值是true
* //m1.setAccessible(true);
* 当操作的方法是静态的方法时候,因为静态方法调用方式是 类名.方法名,不需要类的实例
* 使用反射操作静态方式时候,也是不需要实例
* 在invokie方法的第一个参数里面,写一个 null
- m1.invoke(null, "niuqi");
0 0
- 反射详解
- 反射详解
- 反射详解
- 反射详解
- 反射详解
- 反射详解
- 反射详解
- 反射详解
- 反射详解
- 反射详解!
- 反射详解
- java反射机制详解!
- java 反射机制详解
- 消息反射详解
- 详解C#中的反射
- JAVA反射详解
- C#反射实例详解
- JAVA反射机制详解
- Android推送通知机制分析
- 进制转换
- 线程和类关系
- Scala入门
- 【caffe-Windows】mnist实例编译之model的使用-matlab
- 反射详解
- 彻底理解单例模式
- YYYY-mm-dd HH:MM:SS
- 关于2016年9-10月份的研究方向
- Java - 华为机试训练 - 简单密码破解
- 数据库中的自然连接、选择、投影
- 关于C++ const 的全面总结
- DES加密和解密
- Object.keys()应用