Java学习笔记---反射
来源:互联网 发布:linux解压gz文件命令 编辑:程序博客网 时间:2024/06/07 23:45
Java学习笔记—反射
- 应用场景:通用性比较高的代码中
- 框架的底层是反射
在框架开发中,都是基于配置文件开发,配置文件中配置了类 ,可以通过反射得到类中的所有内容,可以让类中的某个方法来执行
- 类中所有内容包括:属性、没有参数的构造方法、有参数的构造方法、普通方法反射的基本原理:
- 第一步:将写好的代码保存成*.java文件(本地硬盘中)
- 第二步:编译*.java文件成.class文件
- 第三步:把.class文件通过类加载器加载到内存中(JVM)
第四步:.class文件在内存中用Class类表示,得到Class类(字节码文件),就可以得到类中所有内容
- 使用反射首先需要得到Class类,有三种方法可以得到Class类:
1、类名.class
2、对象.getClass()
3、使用Class.forName(“路径”)- 类中不同内容的类不同:
1、属性 — Field
2、构造方法 — Constructor
3、普通方法 — Method
- 类中不同内容的类不同:
- 使用反射首先需要得到Class类,有三种方法可以得到Class类:
使用反射操作类
- 首先获取到Class类
import org.junit.Test;public class TestDemo { public static void main(String[] args) throws Exception { //获取Class类 Class clazz1 = Person.class; Class clazz2 = new Person().getClass(); Class clazz3 = Class.forName("fanshe.Person"); }}
/*要对一个类进行实例化有两种方法: 1、可以new 2、不new 使用反射获取方式如下*/ /*操作无参构造方法*/
//操作无参数的构造方法 @Test public void test1() throws Exception{ //得到Class Class clazz3 = Class.forName("fanshe.Person"); //得到Person类的实例 Person p = (Person) clazz3.newInstance(); //设置值 p.setName("zhangsan"); System.out.println(p.getName()); }
/*操作有参构造方法*/
//操作有参的构造方法 @Test public void test2() throws Exception{ //得到Class Class clazz1 = Class.forName("fanshe.Person"); //使用有参的构造方法 //clazz1.getConstructors();//获取所有的构造方法,不常用 //传递的是有参的构造方法里面的参数类型,类型使用Class形式传递 Constructor cs = clazz1.getConstructor(String.class,String.class); //通过有参构造方法设置值 //通过有参构造方法创建person实例 Person p = (Person) cs.newInstance("lisi","20"); System.out.println(p.getId()+" "+p.getName()); }
/*操作name属性*/
//操作name属性 @Test public void test3(){ try{ //得到class Class clazz2 = Class.forName("fanshe.Person"); //得到name属性 //clazz2.getDeclaredFields();//得到所有属性,不常用 //通过下面的方法得到属性,参数是属性的名称 Field field = clazz2.getDeclaredField("name"); //得到Person类的实例 Person person = (Person) clazz2.newInstance(); //设置可以操作私有属性; field.setAccessible(true);//如果不写这句话,会报错,报错原因:私有属性不能更改 //设置name set方法:两个参数,第一个参数类的实例,第二个参数是设置 field.set(person, "wangwu");//相当于p.name = "wangwu"; System.out.println(field.get(person));//相当于p.name }catch(Exception e){ e.printStackTrace(); } }
/*使用泛型操作普通方法*/
//操作普通方法,比如操作setName @Test public void test4() throws Exception{ //得到Class类 Class clazz4 = Class.forName("fanshe.Person"); //得到普通方法 //clazz4.getDeclaredMethods();//得到所有的普通方法 不常用 //要传递两个参数,第一个参数是方法名,第二参数是通过方法设置的值(是类) Method m1 = clazz4.getDeclaredMethod("setName", String.class); //得到实例 Person person = (Person) clazz4.newInstance(); //操作的是私有方法的话,需要设置下面值为true(这里可以不写) clazz4.setAccessible(true); //让setName方法执行,执行设置值 //使用invoke(person, "zhaoliu")方法,第一个参数是person的实例,第二个是设置的值 //执行了invoke(person, "zhaoliu")方法之后,相当于执行了setname("zhaoliu")这个方法,同时向里面传递了参数 m1.invoke(person, "zhaoliu"); System.out.println(person.getName()); }
- 当操作的方法是静态方法时,因为静态方法调用的方式是:类名.方法名,不需要类的实例
- 使用反射操作静态方法的时候,也不需要实例
- 在invoke方法的第一个参数里面,写一个null
- 如: m1.invoke(null, “zhaoliu”);
- 使用反射操作静态方法的时候,也不需要实例
阅读全文
1 0
- Java 反射学习笔记
- Java反射学习笔记
- java反射学习笔记
- Java反射学习笔记
- Java 反射学习笔记
- Java反射学习笔记
- Java学习笔记----反射
- Java反射学习笔记
- Java反射学习笔记
- Java反射学习笔记
- JAVA反射学习笔记
- 反射java学习笔记
- JAVA 反射学习笔记
- Java学习笔记--反射
- Java学习笔记---反射
- JAVA学习笔记-----反射
- 反射学习笔记:Java反射机制
- Java反射机制学习笔记
- ubuntu 16.10 安装 openjdk 7
- Java 链式调用
- socket服务器
- hihocoder 字符消除
- AES加密解密
- Java学习笔记---反射
- Android-times-square自定义样式
- Python-时间处理
- 如何免费使用webstorm
- junit的错误 No tests found matching [{ExactMatcher:fDisplayName=test2],
- RMI远程服务操作
- Jsonp实现跨域详解
- js Date 获取 年 月 日 具体的值
- java web中servlet实现post方法上传多文件数据接收