java反射用法——创建对象、调用方法、读写成员变量


反射调用一般有几个知识点:

  • 得到要调用类的class
  • 通过class创建对象实例
  • 得到要调用的类中的方法(Method)
  • 方法调用(invoke)
  • 获取反射对象的变量
  • 设置反射对象的私有变量可更改

 

    /**
     * 
     * @param className 类路径的名字
     * @return 返回根据className指明的类信息
     */
    public static Class getclass(String className){
        Class c=null;
        try {
            c=Class.forName(className);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ClassMain.class.getName()).log(Level.SEVERE, null, ex);
        }
        return c;
    }
 
    /**
     * 
     * @param name 类路径
     * @param classParas Class类信息参数列表
     *  如果是基本数据类型是可以使用其Tpye类型,如果用class字段是无效的
     *  如果是非数据类型可以使用的class字段来创建其Class类信息对象,这些都要遵守。
     * @param paras      实际参数列表数据
     * @return           返回Object引用的对象,实际实际创建出来的对象,如果要使用可以强制转换为自己想要的对象
     * 
     * 带参数的反射创建对象
     */
    public static Object getInstance(String name,Class classParas[],Object paras[]){
        Object o=null;
        try {
            Class c=getclass(name);
            Constructor con=c.getConstructor(classParas);//获取使用当前构造方法来创建对象的Constructor对象,用它来获取构造函数的一些
            try {
                //信息
                o=con.newInstance(paras);//传入当前构造函数要的参数列表
            } catch (InstantiationException ex) {
                Logger.getLogger(ClassMain.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                Logger.getLogger(ClassMain.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalArgumentException ex) {
                Logger.getLogger(ClassMain.class.getName()).log(Level.SEVERE, null, ex);
            } catch (InvocationTargetException ex) {
                Logger.getLogger(ClassMain.class.getName()).log(Level.SEVERE, null, ex);
            }
        } catch (NoSuchMethodException ex) {
            Logger.getLogger(ClassMain.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SecurityException ex) {
            Logger.getLogger(ClassMain.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return o;//返回这个用Object引用的对象
    }
 
    /**
     * 
     * @param name 类路径
     * @return 不带参数的反射创建对象
     */
    public static Object getInstance(String name){
        Class c=getclass(name);
        Object o=null;
        try {
             o=c.newInstance();
        } catch (InstantiationException ex) {
            Logger.getLogger(ClassMain.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(ClassMain.class.getName()).log(Level.SEVERE, null, ex);
        }
        return o;
    }
  

  /**
  *
  * @param className 类路径
  * @param methodName 成员方法名字
  * @param param 参数值
  * @return
  */
  public static void call(String className, String methodName, Integer param){
    Class cls = Class.forName(className);
    Object obj = cls.newInstance();
    Method method = cls.getDeclaredMethod(methodName, Integer.class);
    method.invoke(obj, param);
  }

  /**
  * 设置私有变量
  * @param className 类路径
  * @param field 成员变量名字
  * @param value 成员变量值
  * @return
  */
  public static void setPrivateField(String className, String field, int value){
    Class cls = Class.forName(className);
    Object obj = cls.newInstance();
    Field field = cls.getDeclaredField(field);
    field.setAccessible(true);//设置允许访问
    field.set(obj, value);
  }

  

 

用法如下:

 

public static void main(String args[]){
        //创建不带参数的对象
        //ReflectClass rc1=(ReflectClass) ClassXXX.getInstance("com.jijing.classDemo.ReflectClass");
//System.out.println("ReflectClass111="+rc1); System.out.println("******************************"); ReflectClass rc2=(ReflectClass) ClassXXX.getInstance("com.jijing.classDemo.ReflectClass", new Class[]{Integer.TYPE,String.class,MyClass.class}, new Object[]{20,"我是ReflectClass",new MyClass("我是MyClass")}); System.out.println("ReflectClass222="+rc2);
}

  


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM