- 应用在一些通用性比较高的代码中
- 大多数框架都是用了反射来实现
- 在框架开发中,都是基于配置文件来发,在配置文件中配置了类,可以通过反射得到类中的所有内容,可以让类中的某个方法来执行
- 类中的所有内容:属性,无参构造方法,有参构造方法,普通方法
- 反射的原理:(1)首先需要把java文件保存到本地的硬盘中 .java (2)编译java文件成 .class文件 (3)使用jvm,把class文件通过类加载到内存中 (4)java中万事万物皆对象, class文件在内存中使用Class类表示 (5)当使用反射时候,首先需要获取class类,得到这个类后。就可以得到class文件里面的所有内容包含属性,构造方法,普通方法。 (6)属性通过一个类Filed,构造方法通过一个类Constructor,普通方法通过 一个类Method
package cn.itcast.test01; public class person { private String name; private String 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; } //构造方法无参 public person() {} public person(String name, String id) { this.name = name; this.id = id; } }
package cn.itcast.test01; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import javax.swing.text.GapContent; public class TestDemo { public static void main(String[] args) throws Exception { //获取class类 //Class c1=person.class; //Class c2=new person().getClass(); //Class c3=Class.forName("cn.itcast.test01.person"); //test1(); //test2(); //test3(); test4(); } //操作无参的构造方法 private static void test1() throws Exception { //获取class类 Class c3=Class.forName("cn.itcast.test01.person"); //得到person实例 person p=(person) c3.newInstance(); p.setName("zhangsan"); System.out.println(p.getName()); } //操作有参数的构造方法 private static void test2() throws Exception { //获取class类 Class c3=Class.forName("cn.itcast.test01.person"); //使用有参的构造方法 //c3.getConstructors();//获得所有的构造方法 //传递是有参数构造方法里面的参数,类型使用class传递 Constructor cs= c3.getConstructor(String.class,String.class); //通过有参的构造方法设置值 //通过有参的构造方法创建person实例 person p=(person) cs.newInstance("lisi","100"); System.out.println(p.getId()+" "+p.getName()); } //操作name属性 private static void test3() throws Exception { //获取class类 Class c3=Class.forName("cn.itcast.test01.person"); //得到person实例 person p=(person) c3.newInstance(); //c3.getDeclaredFields();//获得所有的属性 //获得name属性 Field f= c3.getDeclaredField("name"); //操作私有属性不让操作需要设置可以操作私有属性setAccessible(true); f.setAccessible(true); //设置name的值 用set方法 第一个参数是person的实例 第二个参数是name的值 f.set(p, "zhangsan");//相当于p.name="zhangsan" System.out.println(f.get(p)); } private static void test4() throws Exception { //获取class类 Class c3=Class.forName("cn.itcast.test01.person"); //得到person实例 person p=(person) c3.newInstance(); c3.getDeclaredMethods();//得到所有的普通方法 //传递两个参数 第一个是方法名称 第二个是通过方法设置的值 Method m= c3.getDeclaredMethod("setName",String.class); //让setname执行 //传递两个参数第一个是person的实例 第二个是设置的值 //执行invoke后相当于执行了setname方法,同时通过这个方法设置了值 m.invoke(p, "niuqi"); System.out.println(p.getName()); //操作私有方法需要设置m.setAccessible(true) } /* *当操作的方法是静态的方法时,因为静态方法调用的方式是类名.方法名不需要实例 * 使用反射操作静态方法时也不需要实例 * m.invoke(null,"niuqi") * * */ }
java 反射原理
最新推荐文章于 2022-05-18 14:52:10 发布