1.什么叫做反射
将类中成员属性以及方法映射为一个个对象叫做反射
2.什么是反射机制
在运行状态中,对于每个类都可以知道这个类中属性和方法,对于任意一个对象都可以通过这个对象去调用属性和方法,对于这种动态获取数据的能力叫做反射机制。
3.反射对象(也叫类对象)
当程序运行时,jvm将.class(字节码)文件从磁盘加载到内存的方法区中,然后jvm和类加载器会一起加载.class文件,生成类对象(反射对象)。一个类只会生成一个类对象,也叫反射对象
4.获取发射对象
全限定类名:包名.类名
4.1对象.geclass()
4.2类名.class()
4.3class.forname(全限定类名)
5.用反射对象操作类的属性
public class Cat {
private String name;
private Integer age;
private Cat(){
}
private Cat(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Test {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class <Cat> c1 = (Class<Cat>) Class.forName("com.ycl.day_10_30.constructor.Cat");
Constructor <Cat> constructorTest1 = c1.getDeclaredConstructor(String.class,Integer.class);
constructorTest1.setAccessible(true);
System.out.println("当前构造方法的访问修饰符="+constructorTest1.getModifiers());
System.out.println("当前构造方法的名称"+constructorTest1.getName());
System.out.println("当前构造方法的参数类型"+ Arrays.toString(constructorTest1.getGenericParameterTypes()));
Cat cat = constructorTest1.newInstance("小美",22);
//实例方法的属性还是调不出来
System.out.println(cat.toString());
}
}
com.ycl.day_10_30.constructor.Test
当前构造方法的访问修饰符=2
当前构造方法的名称com.ycl.day_10_30.constructor.Cat
当前构造方法的参数类型[class java.lang.String, class java.lang.Integer]
Cat{name='小美', age=22}
6.用反射对象操作类的方法
public class Cat {
private String name;
private Integer age;
private Cat(){
}
Cat(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
private void jump(String name){
System.out.println(name+"在跳");
}
private void Call(String name){
System.out.println(name+"在叫");
}
private void eat(String name){
System.out.println(name+"在吃");
}
}
public class Test1 {
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
fansheMethodTest();
}
public static void fansheMethodTest() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
//类的实例化,用于最下面的对象调用方法
Cat cat = new Cat("小美",2);
//获取类对象
Class<Cat> c1 = (Class<Cat>) cat.getClass();
//获取类对象方法
Method m1 = c1.getDeclaredMethod("jump", String.class);
//禁止类加载和jvm在加载.class文件对对访问修饰符的检测
m1.setAccessible(true);
//获取方法的访问权限 1对应public,2对应priva
System.out.println(m1.getModifiers());
//获取方法的返回值类型
System.out.println(m1.getGenericReturnType());
//返回方法参数类型
System.out.println(Arrays.toString(m1.getGenericParameterTypes()));
//实例对象调用方法(不管方法是私有的还是公共的)
m1.invoke(cat,"小王");//效果等同于cat.jump(String name);
}
}
2
void
[class java.lang.String]
小王在跳
7.用反射对象操作类的构造方法
public class Cat {
private String name;
private Integer age;
private Cat(){
}
Cat(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
private void jump(String name){
System.out.println(name+"在跳");
}
private void Call(String name){
System.out.println(name+"在叫");
}
private void eat(String name){
System.out.println(name+"在吃");
}
}
public class Test {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class <Cat> c1 = (Class<Cat>) Class.forName("com.ycl.day_10_30.constructor.Cat");
Constructor <Cat> constructorTest1 = c1.getDeclaredConstructor(String.class,Integer.class);
constructorTest1.setAccessible(true);
System.out.println("当前构造方法的访问修饰符="+constructorTest1.getModifiers());
System.out.println("当前构造方法的名称"+constructorTest1.getName());
System.out.println("当前构造方法的参数类型"+ Arrays.toString(constructorTest1.getGenericParameterTypes()));
Cat cat = constructorTest1.newInstance("小美",22);
//实例方法的属性还是调不出来
System.out.println(cat.toString());
}
}