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 }