java反射机制(基础版)

  1 package com.reflect;
  2 
  3 import java.lang.reflect.Constructor;
  4 import java.lang.reflect.Field;
  5 import java.lang.reflect.Method;
  6 
  7 /**
  8  * java反射机制的基础方法
  9  * @author dr
 10  *
 11  */
 12 public class ReflectTest {
 13     public static void main(String[] args) throws Exception {
 14     //每个类被加载之后 系统都会为其生成一个Class对象,通过该Class对象可以访问该类的xinxi
 15     //1、获取Class对象(三种方式)
 16         // 1> Class.forName();
 17         Class p1 =  Class.forName("com.reflect.Person");
 18         // 2>类.class属性获取Class对象
 19         Class p2 = Person.class;
 20         // 3>对象的getClass()方法获取Class对象
 21         Person person = new Person();
 22         Class p3 = person.getClass();
 23     //2、创建对象
 24         // 1>Class对象的newInstance()方法 创建对象 使用默认的构造器构造实例
 25         Person p = (Person) p1.newInstance();
 26         // 2>使用Class对象获取指定的构造器 在用构造器对象的newInstance()的方法创建对象
 27         Constructor<Person> actor =  p2.getConstructor(String.class,String.class);
 28         p = actor.newInstance("bai","123");
 29         System.out.println(p.getName());
 30     //3、用Class对象获取信息
 31         // 1>获取构造函数 返回所有的构造函数 与访问级别没有关系
 32             Constructor<Person>[] actors = p2.getDeclaredConstructors();
 33             for(Constructor<Person> a:actors){
 34                 System.out.println(a.getName());
 35             }
 36         // 2>获取构造函数 返回所有的构造函数 只获取public 的构造函数
 37             Constructor<Person>[] acts = p2.getConstructors();
 38             for(Constructor<Person> a:acts){
 39                 System.out.println(a.getName());
 40             }
 41         // 3>返回指定参数的构造函数 
 42             //(使用getConstructor()只能获取取到public类型的构造函数,此时报错:java.lang.NoSuchMethodException)
 43             //Constructor<Person> single = p2.getConstructor(String.class);
 44             //(使用getConstructor()只能获取取到public类型的构造函数,此时报错:
 45             //ReflectTest can not access a member of class com.reflect.Person with modifiers "private")
 46             //这个时候设置可以访问私有属性或方法的权限即可
 47             Constructor<Person> single = p2.getDeclaredConstructor(String.class);
 48             single.setAccessible(true);
 49             Person pp = single.newInstance("name");
 50             System.out.println(pp.getName());
 51         // 4> 获取和调用方法 (获取所有的方法 以及所有共有的方法 指定的方法 为私有方法设置访问权限等 与construct类似)
 52             Method method = p2.getMethod("getName",null);
 53             System.out.println(method.invoke(p, null));
 54             //设置方法名称 和 该方法所需参数的类型的Class
 55             Method m = p2.getDeclaredMethod("setName", String.class);
 56             //调用的使用要指定哪个对象调用的 和传入的参数
 57             m.invoke(p, "baichuanyu");
 58             System.out.println(p.getName());
 59         // 5> 访问属性值
 60             //name属性是私有属性
 61             Field field = p2.getDeclaredField("name");
 62             //报错:Class ReflectTest can not access Person with modifiers "private"
 63             //field.set(p, "field");
 64             //为Person对象 p 的私有属性name赋值 field
 65             field.setAccessible(true);
 66             field.set(p, "field");
 67             System.out.println(p.getName());
 68     }
 69 }
 70 
 71 class Person{
 72     private String name;
 73     private String age;
 74     
 75     public Person(){
 76         
 77     }
 78     
 79     private Person(String name){
 80         this.name = name;
 81     }
 82     
 83     public Person(String name, String age) {
 84         super();
 85         this.name = name;
 86         this.age = age;
 87     }
 88     public String getName() {
 89         return name;
 90     }
 91     public void setName(String name) {
 92         this.name = name;
 93     }
 94     public String getAge() {
 95         return age;
 96     }
 97     public void setAge(String age) {
 98         this.age = age;
 99     }
100     
101 }
原文地址:https://www.cnblogs.com/Wen-yu-jing/p/3534219.html