zoukankan      html  css  js  c++  java
  • java中的反射

    反射指动态获取类及类中的内容

    示例代码:String className = "cn.itheima.web.servlet.MyServletImpl";
                        Class clazz = Class.forName(className);
                        MyServletImpl my = (MyServletImpl) clazz.newInstance();

    如何获取类的Class对象(字节码文件)?

    1,通过Object类的getClass() 方法 ,需要先创建对象       -----比较两个文件是否为同一个字节码文件

    2,通过Class的静态属性    .class  获取     -----锁对象

    3,通过Class的静态方法,Class.forName( )方法获取   ----读取配置文件


    如何获取Class对象所对应的类的构造方法?

    1,无参构造,可以直接用newInstance( )来创建对象

    2,有参构造,可以用 getConstructor( )来获取构造方法,(括号里不传入参数是获取无参构造方法,传入参数是获取有参构造)再使用newInstance( )来创建对象

    代码演示如下:

    Class clazz = Class.forName("Bean.Person"); //获取Person类的Classd对象
    Constructor constructor = clazz.getConstructor(String.class, int.class); //(反射阶段) 获取有参构造,不传入参数则是获取无参构造
    Person p = (Person) constructor.newInstance("张三", 23); // 根据有参构造创建实例
    System.out.println(p);

    如何获取Class对象所对应的类或接口的定义的变量,字段?

    1,如是公共变量,可以在获取Class对象后,调用getField(String ?)获取

    2,如是私有变量,可以在获取Class对象后,调用getDeclaredField(Sting ?)暴力获取 声明的变量,如需改变其值,则需用,setAccessible(ture)去除私有权限

    Class clazz = Class.forName("Bean.Person"); //获取Person类的Classd对象
    Constructor constructor = clazz.getConstructor(String.class, int.class); 
    Person p = (Person) constructor.newInstance("张三", 23); // 根据有参构造创建实例
    //Field field = clazz.getField("name"); //获取公共变量
    Field declaredField = clazz.getDeclaredField("name");
    declaredField.setAccessible(true);//去除私有属性
    declaredField.set(p, "李四");
    System.out.println(p);

    如何获取Class对象对应的类或接口中的方法?

    1,公共方法,getMethod( )

    2,私有方法,getDeclaredMethod( )

    注意: 我印象中记得不能通过反射获取父类中的私有方法,要获取需要递归通过getSuperClass()获取父类字节码,参考这篇博文

    Class clazz = Class.forName("Bean.Person"); //获取Person类的Classd对象 
    Object p = clazz.newInstance();
    Method method = clazz.getMethod("play",int.class);//反射阶段
    method.invoke(p, 5);

    通过反射越过泛型检查: 

    package Reflect;
    
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    
    import org.omg.CORBA.INTERNAL;
    
    public class demo6_test1 {
    	// 通过反射越过越过泛型检查(泛型检擦只在编译器,在运行期,反射阶段可以跳过检查)
    	public static void main(String[] args) throws Exception {
    		ArrayList<Integer> al = new ArrayList<>();
    		al.add(11);
    		Class<?> clazz = Class.forName("java.util.ArrayList");
    		Method method = clazz.getDeclaredMethod("add", Object.class);// ArrayList类里的add方法里的原有的参数类型是Object
    		method.invoke(al, "abc");
    		System.out.println(al);
    	}
    	
    }
    作者:wuba
    出处:http://www.cnblogs.com/wuba/
    版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议。转载请注明出处!
  • 相关阅读:
    JavaSE第十五天20160823
    JavaSE第十四天20160822
    JavaSE第十三天20160819
    pojo和javabean的比较
    JavaSE第十二天20160818
    JavaSE第十一天20160817
    修正MyEclipse的SpellChecking
    JavaSE第十天20160816
    JavaSE第九天20160815
    Servlet中的init()方法如何才会在服务器启动时执行
  • 原文地址:https://www.cnblogs.com/wuba/p/11025534.html
Copyright © 2011-2022 走看看