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 }