zoukankan      html  css  js  c++  java
  • 反射

    反射

    import java.lang.reflect.*;
    package reflect;
    class Demo{
    
    }
    

    对象获得完整的包名和类名:demo.getClass().getName()
    实例化class类对象:
    Class<?> demo1=Class.ForName("reflect.Demo");
    Class<?> demo2= new Demo().getClass();
    Class<?> demo3=Demo.class;

    通过无参构造实例化对象

    Class<?> demo=Class.ForName("reflect.Demo");
    Demo d=(Demo)demo.newInstance();
    使用Class实例化其他类的对象的时候,一定要自己定义无参的构造函数,否则抛错

    获得构造函数

    Constructor<?> cons[]=demo.getConstructors();
    Demo d1=(Demo)cons[0].newInstance();//默认无参构造
    Demo d2=(Demo)cons[1].newInstance(“1234”);//有参数构造器

    获得类实现接口

    Class<?> demo=Class.ForName("reflect.Demo");
    Class<?> intes[]=demo.getInterfaces();

    获得父类

    Class<?> temp=demo.getSuperclass();

    获得类属性

    Field[] field = demo.getDeclaredFields();
    // 权限修饰符
    int mo = field[i].getModifiers();
    String priv = Modifier.toString(mo);
    // 属性类型
    Class<?> type = field[i].getType();

    反射调用其他类中的方法

    Class<?> demo = Class.forName("Reflect.Demo");
    Method method=demo.getMethod("sayHello");
    method.invoke(demo.newInstance());

    method=demo.getMethod("sayHello", tring.class,int.class);//2个参数,string和int
    method.invoke(demo.newInstance(),"Rollen",20);

    调用其他类的set和get方法

    obj=demo.newInstance();
    Method method = obj.getClass().getMethod("getName");
    String name=method.invoke(obj);

    Method method = obj.getClass().getMethod("setName", String.class);
    method.invoke(obj,value);

    反射操作类属性

    Class<?> demo = Class.forName("Reflect.Person");
    Object obj = demo.newInstance();

    Field field = demo.getDeclaredField("sex");
    field.setAccessible(true);
    field.set(obj, "男");

    反射取得并修改数组信息

    int[] temp={1,2,3,4,5};
    Class<?>demo=temp.getClass().getComponentType();
    System.out.println("数组类型: "+demo.getName());
    System.out.println("数组长度 "+Array.getLength(temp));
    System.out.println("数组的第一个元素: "+Array.get(temp, 0));
    Array.set(temp, 0, 100);
    System.out.println("修改之后数组第一个元素为: "+Array.get(temp, 0));

    获得类加载器

    test t=new test();
    t.getClass().getClassLoader().getClass().getName();//
    输出:sun.misc.Launcher$AppClassLoader
    java中有三种类类加载器。
    1)Bootstrap ClassLoader 此加载器采用c++编写,一般开发中很少见。
    2)Extension ClassLoader 用来进行扩展类的加载,一般对应的是jrelibext目录中的类
    3)AppClassLoader 加载classpath指定的类,是最常用的加载器。同时也是java中默认的加载器。

    反射,可以用于工厂模式,加强类的扩展能力。

    定义fruit.properties文件
    apple=Reflect.Apple
    orange=Reflect.Orange
    //获取properties文件
    Properties pro=new Properties();
    File f=new File("fruit.properties");
    if(f.exists()){
      pro.load(new FileInputStream(f));}
    //反射生成实例对象
    Fruit f=(Fruit)Class.ForName(pro.getProperty("apple")).newInstance();
    
    

    参考这里



    I am a slow walker, but I never walk backwards.



  • 相关阅读:
    [技巧] 使用Word2010直接编辑、发布博客→博客园cnblogs
    POJ 1201 Intervals【差分约束】
    HDU 2896 病毒侵袭【AC自动机】
    opengl中的gluOrtho2D【转】
    【转】x86和x64的含义和区别
    POJ 1704 Georgia and Bob【Nim博弈】
    POJ 1947 Rebuilding Roads【树状DP】
    POJ 3207/ POJ 3678 【2SAT】
    POJ 1067 取石子游戏【威佐夫博奕】
    apache+webdav的安装配置
  • 原文地址:https://www.cnblogs.com/lknny/p/5622523.html
Copyright © 2011-2022 走看看