Reflect


反射

反射3种实例化方法

  1. 使用实例化对象.getclass()方法;
  2. 类.class
  3. 使用Class.forName(String str)方法

通过反射实例化对象

通过newinstance()方法获取类的实例化对象相比于new方法虽然麻烦,但是可以不在需要手工去创建对象。在项目维护后期,如果需要添加一定量的类,可以通过制定类的全路径名来反射创建类的实例化对象,而不再需要去更改工厂类的代码。

class B{
    public B(){
        System.out.println("ok");
    }

    @Override
    public String toString() {
        return "ok1";
    }
}
public class test1 {
    public static void main(String[] args) throws Exception {
        Class <?> cls = Class.forName("package.B");
        Object obj = cls.newInstance();
        B b = (B) obj;
        System.out.println(b);
    }
}
class C{
    C(){
        System.out.println("C");
    }
}
class Factory{
    public static Object getInstance(String str) throws Exception  {

        return Class.forName(str).newInstance();
    }
}
public class test1 {
    public static void main(String[] args) throws Exception {
        Object obj = Factory.getInstance("demo3.C");
    }
}

通过反射调用构造函数

  • getConstructor(参数类...) 获取指定的构造函数
class C{
    private int a=0;
    C(int a ){
        this.a = a;
    }
}
public class test1 {
    public static void main(String[] args) throws Exception {
        Class<?> cls = Class.forName("demo3.C");
        Constructor<?> con = cls.getConstructor(int.class);
        Object obj = con.newInstance(12);
    }
}

通过反射调用普通函数

  • getMethod()获取指定方法(不包含私有方法)
  • getDeclaredMethod()获取指定方法
  • getMethods()获取所有方法(不包含私有方法)
  • getDeclaredMethods()获取所有方法
class C{
    public int get(){
        System.out.println("OK");
        return 1;
    }
    public void set(String str){
        System.out.println(str);
    }
}
public class test1 {
    public static void main(String[] args) throws Exception {
        Class<?> cls = Class.forName("demo3.C");
        Object obj = cls.newInstance();
        Method setMe = cls.getMethod("set",String.class);
        Method getMe = cls.getMethod("get");
        setMe.invoke(obj,"set");
        getMe.invoke(obj);
    }
}

通过反射获取成员变量

  • getField(String str)获取指定成员(不包含私有)
  • getDeclaredField(String str)获取指定成员
  • getFields(String str)获取所有成员(不包含私有)
  • getDeclaredFields(String str)获取所有成员
class C{
    private int a=1;

}
public class test1 {
    public static void main(String[] args) throws Exception {
        Class<?> cls = Class.forName("demo3.C");
        Object obj = cls.newInstance();
        Field field = cls.getDeclaredField("a");
        field.setAccessible(true);
        field.set(obj,12);
    }
}

文章作者: Fanrencli
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Fanrencli !
  目录