反射

1.每个类被加载后,系统都会为该类生成一个对应的Class对象,通过该Class对象就可以访问到JVM中的这个类

2.Java程序中获得Class对象通常有如下三种方式:

1)使用Class的forName()

2)调用某个类的class属性

3)调用某个对象的getClass()

3.一旦获取了某个类的Class对象之后,程序就可以调用Class对象的方法来获得该对象和该类的真实信息了

4.加载过程:

Cat.java---->编译---->Cat.class---->加载至JVM(classload())---->Class对象---->以Class对象为模板进行创建对象

5.获取Class对象

public class ReflectionDemo{
    public static void main(String [] args) throws Exception{
        //得到Class对象
        Class clazz=Class.forName("Cat");
        Class clazz2=Cat.class;
        Class clazz3=new Cat().getClass();
        //clazz,clazz2,clazz3都指向同一个对象
        if(clazz==clazz2 && clazz2==clazz3){
            System.out.println("same");
        }
    }
}
class Cat{
    private String name;
    public void show(){
        System.out.println("cat cry");
    }
}

6.利用反射创建对象

使用默认构造函数实例化对象    
public static void main(String [] args) throws Exception{
    //得到Class对象
    Class clazz=Class.forName("Cat");
    Cat cat=(Cat) clazz.newInstance();
    cat.show();
}
使用带参数的构造函数实例化对象,普通类型参数
import
java.lang.reflect.Constructor; public class ReflectionDemo{ public static void main(String [] args) throws Exception{ //得到Class对象 Class clazz=Class.forName("Cat"); Constructor c=clazz.getConstructor(String.class,int.class); Cat cat=(Cat) c.newInstance("lvjy",28); System.out.println(cat.getName()); cat.show(); } }
传递数组类型的参数
import
java.lang.reflect.Constructor; public class ReflectionDemo{ public static void main(String [] args) throws Exception{ //得到public Cat(String [] food)构造函数 Class clazz=Class.forName("Cat"); Constructor c=clazz.getConstructor(String[].class); Cat cat=(Cat) c.newInstance((Object) new String[]{"fish","mouse"}); for(String f:cat.getFood()){ System.out.println(f); } } }
import java.lang.reflect.Constructor;
public class ReflectionDemo{
    public static void main(String [] args) throws Exception{
        //得到public Cat(String [] food)构造函数
        Class clazz=Class.forName("Cat");
        Constructor c=clazz.getConstructor(String[].class);
        Cat cat=(Cat) c.newInstance(new Object[]{new String[]{"fish","mouse"}});
        for(String f:cat.getFood()){
            System.out.println(f);
        }
    }
}

7.利用反射调用函数

调用无参函数
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ReflectionDemo{
    public static void main(String [] args) throws Exception{
        //得到public Cat(String [] food)构造函数
        Class clazz=Class.forName("Cat");
        Method m=clazz.getMethod("show");
        m.invoke(clazz.newInstance());
        
    }
}
调用有参函数
import
java.lang.reflect.Constructor; import java.lang.reflect.Method; public class ReflectionDemo{ public static void main(String [] args) throws Exception{ //得到public Cat(String [] food)构造函数 Class clazz=Class.forName("Cat"); Method m=clazz.getMethod("show",String.class); m.invoke(clazz.newInstance(),"lvjy"); } }
调用私有函数
import
java.lang.reflect.Constructor; import java.lang.reflect.Method; public class ReflectionDemo{ public static void main(String [] args) throws Exception{ Class clazz=Class.forName("Cat"); Method m=clazz.getDeclaredMethod("greeting"); m.setAccessible(true);//暴力访问 m.invoke(clazz.newInstance()); } }


8.利用反射访问成员变量

访问公有变量
import
java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.lang.reflect.Field; public class ReflectionDemo{ public static void main(String [] args) throws Exception{ Class clazz=Class.forName("Cat"); Field f=clazz.getField("name"); //取得f的值 String name=(String)f.get(clazz.newInstance()); System.out.println(name); } }
访问私有变量
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Field;
public class ReflectionDemo{
    public static void main(String [] args) throws Exception{
        Class clazz=Class.forName("Cat");
        Field f=clazz.getDeclaredField("age");
        f.setAccessible(true);
        Cat cat=(Cat) clazz.newInstance();
        f.set(cat,30);
        System.out.println(f.get(cat));
    }
}
原文地址:https://www.cnblogs.com/lvjygogo/p/8546444.html