反射的简单使用
一.通过反射来获取类的公有私有属性和方法
1.创建一个类Person,里边有私有属性和公有属性,私有方法和公有方法
public class Person {
//私有属性
private String name;
//公有属性
public int age;
//公有构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//私有构造方法
private Person(String name){
this.name=name;
}
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void show(){
System.out.println("hello World!");
}
//私有方法
private String showNation(String s){
System.out.println("我的国籍是"+s);
return s;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
2.创建类ReflectTest,通过反射对上边创建的类Person的属性和方法进行各种操作
public class ReflectTest {
//反射方式创建对象
@Test
public void testReflection() throws Exception {
//1.通过反射,创建类的对象
Class personClass = Person.class;
Constructor constructor = personClass.getConstructor(String.class,int.class);
Object instance = constructor.newInstance("小红", 12);
Person person = (Person) instance;
System.out.println(person);
//2.通过反射,调用指定的属性
Field name = personClass.getDeclaredField("age");
//通过对象操作属性
name.set(person,10);
System.out.println(person);
//3.通过反射,调用指定的方法
Method show = personClass.getDeclaredMethod("show");
show.invoke(person);
//4.通过反射,调用私有的构造器
System.out.println("***********************************");
Constructor declaredConstructor = personClass.getDeclaredConstructor(String.class);
declaredConstructor.setAccessible(true);
Person jerry = (Person) declaredConstructor.newInstance("jerry");
System.out.println(jerry);
//5.通过反射,调用私有的属性
Field name1 = personClass.getDeclaredField("name");
name1.setAccessible(true);
name1.set(person,"lili");
System.out.println(person);
//6.通过反射,调用私有的方法
//第一个参数是方法名,第二个参数是形参
Method showNation = personClass.getDeclaredMethod("showNation", String.class);
showNation.setAccessible(true);
//通过对象调用方法,第一个参数是对象,第二个方法是实参
String china = (String) showNation.invoke(person, "中国");
System.out.println(china);
}
//Class 运行时类
//获取Class的四种方式
@Test
public void test2() throws ClassNotFoundException {
//方式一 调用运行时属性.class
Class<Person> clazz1 = Person.class;
System.out.println(clazz1);
//方式二 通过运行时对象调用getClass
Person person=new Person();
Class clazz2 = person.getClass();
System.out.println(clazz2);
//方式三 调用Class的静态方法(用的较多)
Class clazz3 = Class.forName("com.pojo.reflect.Person");
System.out.println(clazz3);
//方式四 使用类加载器(了解)
ClassLoader classLoader = ReflectTest.class.getClassLoader();
Class clazz4 = classLoader.loadClass("com.pojo.reflect.Person");
System.out.println(clazz4);
System.out.println(clazz1==clazz2);
System.out.println(clazz1==clazz3);
System.out.println(clazz1==clazz4);
}
}