简单通过反射获取类对象的实例:
eg1:成员变量
Person:
package Dl;
public class Person {
private int age;
public String name;
protected String phone;//类属于成员变量
}
测试类:
package Dl;
import java.lang.reflect.Field;
import java.util.Arrays;
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
Class class1 = Class.forName("Dl.Person");//磁盘阶段获取
Class class2 = Person.class;//类对象阶段,直接获取
Person person = new Person();//创建Person对象直接获取
Class class3 = person.getClass();
Field[] fields1 = class1.getDeclaredFields();
System.out.println(Arrays.toString(fields1));
Field[] fields2 = class2.getDeclaredFields();
System.out.println(Arrays.toString(fields2));
Field[] fields3 = class3.getDeclaredFields();
System.out.println(Arrays.toString(fields3));
System.out.println(class1 == class2);
System.out.println(class1 == class3);//引用类型判断指向是否为相同地址
//变量值需要空间,我们需要创建对象
nameFiled.set(person, "admin");
System.out.println(nameFiled.get(person));
//private修饰的变量赋值取值是需要暴力反射
//暴力反射
ageFiled.setAccessible(true);
ageFiled.set(person, 16);
System.out.println(ageFiled.get(person));
}
}
输出:
输出:
[private int Dl.Person.age, public java.lang.String Dl.Person.name, protected java.lang.String Dl.Person.phone]
[private int Dl.Person.age, public java.lang.String Dl.Person.name, protected java.lang.String Dl.Person.phone]
[private int Dl.Person.age, public java.lang.String Dl.Person.name, protected java.lang.String Dl.Person.phone]
true
true
admin
16
eg2:方法
Person:
package Dl;
public class Person {
private int age;
public String name;
protected String phone;//类属于成员变量
public void run() {
System.out.println("哥们先run了");
}
private int Age(int age) {
System.out.println(age);
return age;
}
protected String gg(String name,int age) {
System.out.println(name +" "+ age);
return name;
}
}
测试类:
package Dl;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
public class Test {
public static void main(String[] args) throws Exception {
Person person = new Person();
Class class1 = Class.forName("Dl.Person");//磁盘阶段获取
Method[] methods = class1.getDeclaredMethods();//获取方法
System.out.println(Arrays.toString(methods));
Method[] method1 = class1.getMethods();
System.out.println(Arrays.toString(method1));
Method run = class1.getDeclaredMethod("run");
run.invoke(person);//使用person对象
Method Age = class1.getDeclaredMethod("Age", int.class);
Age.setAccessible(true);//暴力反射
Age.invoke(person, 11);
Method gg = class1.getDeclaredMethod("gg", String.class,int.class);
gg.setAccessible(true);
gg.invoke(person, "hs",23);
}
}
输出:
哥们先run了
11
hs 23
eg1:构造器
Person:
package Dl;
public class Person {
private int age;
public String name;
protected String phone;//类属于成员变量
public void run() {
System.out.println("哥们先run了");
}
private int Age(int age) {
System.out.println(age);
return age;
}
protected String gg(String name,int age) {
System.out.println(name +" "+ age);
return name;
}
public Person(int age,String name) {
this.age = age;
this.name=name;
}
public Person() {
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
测试类:
package Dl;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
public class Test {
public static void main(String[] args) throws Exception {
Person person = new Person();
Class class1 = Class.forName("Dl.Person");//磁盘阶段获取
Constructor constructor1 = class1.getConstructor();
constructor1.newInstance();
Constructor constructor2 = class1.getConstructor(int.class,String.class);
Person person2 = (Person) constructor2.newInstance(20,"hh");
System.out.println(person2.name);
System.out.println(person2.getAge());
}
}
输出:
hh
20