Java 进阶知识 反射
概念
将类的各个组成部分封装为其他对象,这就是反射

java代码运行时,类加载器就会将进入内存的类的3个部分封装成对象
反射的好处:1.可以在程序运行过程中操作这些对象。
2.可以解耦,提高程序扩展性。
获取Class类对象的方式
1.Class.forName("全类名")//将字节码文件加载进内存,返回Class对象
2 类名.class //通过类名.class 来获取
3 对象.getClass()方法
3种方式获取的Class对象相同(其实是因为Class对象就是唯一对应的)
package domain;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
}
package reflect;
import domain.Person;
public class ReflectDemo1 {
/*
1.Class.forName("全类名")//将字节码文件加载进内存,返回Class对象
2 类名.class //通过类名.class 来获取
3 对象.getClass()方法
*/
public static void main(String[] args) throws Exception {
//1.Class.forName("全类名")//将字节码文件加载进内存,返回Class对象
Class Cls1 = Class.forName("domain.Person");
System.out.println(Cls1);
//类名.class
Class Cls2 = Person.class;
System.out.println(Cls2);
//对象.getClass()方法
Person person=new Person();
Class Cls3 = person.getClass();
System.out.println(Cls3);
}
}
Class对象功能
获取功能
1.获取成员变量们()
Field[] getFields()//获取所有public的成员变量
Field getField(String name)//获取指定的public的成员变量
Field[] getDeclaredFields()//获取所有的成员变量
Field getDeclaredField(String name)
package reflect;
import domain.Person;
import java.lang.reflect.Field;
public class ReflectDemo2 {
public static void main(String[] args) throws Exception {
Class personClass = Person.class;
Field field = personClass.getDeclaredField("name");
field.setAccessible(true);//强制访问 可以访问和设置private变量
Person person=new Person("jie",20);
System.out.println(field.get(person));
field.set(person,"杰");
System.out.println(person.getName());
}
}
2.获取构造方法们()
Constructor<T> getConstructor(类<?>... parameterTypes)
Constructor<?>[] getConstructors()
Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
Constructor<?>[] getDeclaredConstructors()
package reflect;
import domain.Person;
import java.lang.reflect.Constructor;
public class ReflectDemo2 {
public static void main(String[] args) throws Exception {
Class personClass = Person.class;
//通过参数来确定要获取哪个构造函数
Constructor constructor= personClass.getConstructor(String.class,int.class);
//获取构造函数来创建对象
Person person1 = (Person) constructor.newInstance("jie", 18);
System.out.println(person1.getName());
/*如果使用空参构造 可以使用personClass.newInstance();*/
}
}
3.获取成员方法们()
Method getMethod(String name, 类<?>... parameterTypes)
Method[] getMethods()
Method getDeclaredMethod(String name, 类<?>... parameterTypes)
Method[] getDeclaredMethods()
package reflect;
import domain.Person;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ReflectDemo2 {
public static void main(String[] args) throws Exception {
Class personClass = Person.class;
//获取指定名称的方法
Method eat_method = personClass.getMethod("eat",String.class);
Person person=new Person("jie",18);
eat_method.invoke(person,"面条");
}
}
4.获取类名
String getName()

浙公网安备 33010602011771号