A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 不二晨 金牌黑马   /  2018-6-28 14:22  /  935 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

反射的基本概念大家可以自行百度。我只贴出两段代码,里面有详细的注释,包含了了利用反射机制操作构造函数(有参和无参两种),属性,方法(静态和非静态)。其中心思想就是先获得Class。然后得到要操作的对象。再后调用各自的方法实现具体的操作。

Person类就是被操作的类,即通过反射机制得到该类的对象

[java] view plain copy



  • package cn.itcast.refl;  
  •   
  • /**
  • * 反射操作属性,无参构造,有参构造,普通方法
  • *  
  • * */  
  • public class Person {  
  •     // 属性  
  •     private String name;  
  •   
  •     // 无参构造  
  •     public Person() {  
  •     }  
  •   
  •     // 有参构造  
  •     public Person(String name) {  
  •         this.name = name;  
  •     }  
  •   
  •     // 普通方法(静态)  
  •     public static void add(Integer a) {  
  •         System.out.println(a*20);  
  •     }  
  •   
  •     public String getName() {  
  •         return name;  
  •     }  
  •     //普通方法(非静态)  
  •     public void setName(String name) {  
  •         this.name = name;  
  •     }  
  • }  

TestPerson类是测试Person类。反射操作属性,构造函数,方法的具体实现细节在此体现[java] view plain copy



  • package cn.itcast.refl;  
  •   
  • import java.lang.reflect.Constructor;  
  • import java.lang.reflect.Field;  
  • import java.lang.reflect.Method;  
  •   
  • import org.junit.Test;  
  •   
  • public class TestPerson {  
  •   
  •     /**
  •      * @param args
  •      * @throws ClassNotFoundException
  •      */  
  •     public static void main(String[] args) throws ClassNotFoundException {  
  •         // 通过对象的getClass()  
  •         Person person = new Person();  
  •         System.out.println(person.getClass());  
  •         // 通过类的.class  
  •         System.out.println(Person.class);  
  •         // 通过Class类的forName()  
  •         System.out.println(Class.forName("cn.itcast.refl.Person"));  
  •   
  •     }  
  •   
  •     // 不通过new的方式获取类的实例(操作无参的构造方法)  
  •     @Test  
  •     public void test() throws Exception {  
  •         Person p = (Person) Class.forName("cn.itcast.refl.Person")  
  •                 .newInstance();  
  •         p.setName("haha");  
  •   
  •         System.out.println(p.getName());  
  •     }  
  •   
  •     // 操作有参的构造方法  
  •     @Test  
  •     public void test2() throws Exception {  
  •         Constructor constructor = Person.class.getConstructor(String.class);  
  •         Person p = (Person) constructor.newInstance("wuwu");  
  •         System.out.println(p.getName());  
  •   
  •     }  
  •   
  •     // 操作属性  
  •     @Test  
  •     public void test3() throws Exception {  
  •         // 得到实例化对象  
  •         Class p = Class.forName("cn.itcast.refl.Person");  
  •         Person person = (Person) p.newInstance();  
  •         // 得到属性  
  •         Field field = p.getDeclaredField("name");  
  •         // 使私有属性可获取  
  •         field.setAccessible(true);  
  •         // 属性赋值  
  •         field.set(person, "dudu");  
  •         // 获取  
  •         System.out.println(field.get(person));  
  •   
  •     }  
  •   
  •     // 操作普通方法  
  •     @Test  
  •     public void test4() throws Exception {  
  •         Class c = Person.class;  
  •         Person p = (Person) c.newInstance();  
  •   
  •         // 得到方法  
  •         Method m1 = c.getDeclaredMethod("setName", String.class);  
  •         // 执行非静态方法,并传值  
  •         m1.invoke(p, "lala");  
  •         System.out.println(p.getName());  
  •         // 执行静态方法(与非静态区别就是invole方法的第一个参数是null。)  
  •         Method m2 = c.getDeclaredMethod("add", Integer.class);  
  •         m2.invoke(null, 3);  
  •   
  •     }  
  • }  

最终的运行结果如下

【转载】原文地址:https://blog.csdn.net/weixin_42331540/article/details/80596933


2 个回复

倒序浏览
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马