• 反射入门基础


    TestReflect.java

    package com.huawei.reflect;

    public class TestReflect {

    int a =0;

    private String name = "lisi";

    protected long b = 2L;

    public double c = 3.0d;

    public static short e = 20;

    static String fav = "read";


    public void add(int a,int b){
    System.out.println(a+b);
    }
    public void add(int a,String b){
    System.out.println(a+b);
    }

    private static String say(){
    return "Hello static say";
    }
    private String say(String msg){
    return "Hello "+msg;
    }

    static int add(int a){
    return a+100;
    }

    public static int add(int a,int b, int c){
    return a+b+c;
    }

    public TestReflect() {
    System.out.println("TestRefect.TestRefect()");
    }
    TestReflect(int a) {
    System.out.println("TestRefect.TestRefect() "+a);
    }

    public TestReflect(long b, double c) {
    super();
    this.b = b;
    this.c = c;
    System.out.println("this is a test");
    }

    }

    Test.java

    package com.huawei.reflect;

    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;

    public class Test {
    public static void testGetClass() throws ClassNotFoundException {

    /**
    * 得到一个类的class对象
    *
    * 有一下几种方式
    */

    //直接通过类名.class 得到class对象
    Class<?> clazz = TestReflect.class;

    //通过对象.getClass() 方法得到
    Class<?> clazz1 = new TestReflect().getClass();

    //通过Class提供的forName方法
    Class<?> clazz2 = Class.forName("com.cdsxt.reflect.TestReflect");

    System.out.println(clazz);
    System.out.println(clazz1);
    System.out.println(clazz2);


    }

    /**
    * 测试 得到 类里面的 属性
    * @throws NoSuchFieldException
    * @throws SecurityException
    * @throws IllegalAccessException
    * @throws IllegalArgumentException
    */
    public static void testGetField() throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
    //得到 类的结构信息
    Class<?> clazz = TestReflect.class;

    //得到 公共的成员字段
    Field c = clazz.getField("e");

    TestReflect t = new TestReflect();
    Object oo = new TestReflect();
    Object oo1 = new TestReflect(3L,50.0d);
    // t.e;
    // TestReflect.e;

    //oo.c
    //如果 该属性是隶属于类的 则 取值的时候 不需要指定对象 直接穿null
    // Object o = c.get(oo1);
    Object o = c.get(null);


    System.out.println(o);
    //属性名
    System.out.println(c.getName());
    //得到修饰符
    System.out.println(c.getModifiers());
    //得到Field的class对象
    System.out.println(c.getClass());
    //得到属性字段的类型
    System.out.println(c.getType());


    System.out.println("--------------------");
    //获取 给定类里面的 所有公有的 公共属性
    Field []fields = clazz.getFields();
    for(Field f:fields){
    System.out.println(f.getName());
    //得到修饰符
    System.out.println(f.getModifiers());
    //得到Field的class对象
    System.out.println(f.getClass());
    //得到属性字段的类型
    System.out.println(f.getType());
    }


    //获取已有的属性字段

    Field name = clazz.getDeclaredField("name");
    //得到原来的状态
    boolean flag = name.isAccessible();
    //然后在强制打开
    name.setAccessible(true);
    System.out.println(name.get(oo1));
    //将原来的状态设置回去
    name.setAccessible(flag);
    //System.out.println(name.get(oo1));
    }

    /**
    * 测试 获取方法
    */
    public static void testGetMethod() throws Exception{
    Class<?> clazz = TestReflect.class;
    //o.add(1,2)
    //得到 一个方法的对象

    Method method = clazz.getMethod("add", int.class,String.class);
    //第二种写法

    Method add = clazz.getMethod("add", new Class[]{int.class,int.class});
    Object o = new TestReflect();
    //o.add();
    method.invoke(o, 1,"Hello");
    add.invoke(o, new Object[]{2,10});

    //获取静态方法
    Method add1 = clazz.getMethod("add", new Class[]{int.class,int.class,int.class});
    //通过对象调用
    // Object rs = add1.invoke(o, 10,20,30);
    //通过类去调用
    Object rs = add1.invoke(null, 10,20,30);

    System.out.println(rs);

    System.out.println("----------------------");
    /**
    * 调用没有参数的 方法的时候 在回去的时候 可以不传
    *
    * 在执行的时候 也可以不传
    *
    * 除了public的方法或是 属性或是构造器以外的 都要注意 他们的可访问性
    *
    */
    Method m = clazz.getDeclaredMethod("say");
    m.setAccessible(true);
    Object msg = m.invoke(null);
    System.out.println(msg);

    }

    /**
    * 测试创建实例
    */
    public static void testCreateInstance() throws Exception{
    Class<?> clazz = TestReflect.class;
    //创建实例
    //如果要使用 以下的这种方式 在给定类中 必须要存在 无参构造器
    Object o = clazz.newInstance();

    System.out.println(o);

    // Class<TTT> c = TTT.class;
    // c.newInstance();

    //得到特定的构造器 然后创建实例
    Constructor<?> constructor = clazz.getConstructor(new Class[]{long.class,double.class});

    Object o1 = constructor.newInstance(new Object[]{20L,30.0d});
    System.out.println(o1);

    }



    public static void main(String[] args) throws Exception {
    // testGetClass();
    // testGetField();
    // testGetMethod();

    testCreateInstance();
    }
    }

    class TTT{

    public TTT(int a) {
    super();
    }

    }

  • 相关阅读:
    Munge
    file upload custom form
    随笔摘要
    生成css 和 清缓存
    drupal commit 原则
    Git reset --hard
    www-data
    301/302的区别
    什么是request_uri
    in_array foreach array_search的性能比较
  • 原文地址:https://www.cnblogs.com/hwgok/p/5858430.html
Copyright © 2020-2023  润新知