Chinaunix首页 | 论坛 | 博客
  • 博客访问: 36736
  • 博文数量: 28
  • 博客积分: 368
  • 博客等级: 一等列兵
  • 技术积分: 270
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-13 17:41
文章分类

全部博文(28)

文章存档

2022年(2)

2020年(3)

2017年(1)

2016年(5)

2015年(1)

2012年(4)

2011年(11)

2010年(1)

我的朋友

分类: Java

2016-09-04 12:37:14

//反射类

package cn.study.reflect;

import java.awt.List;

public class StudyReflect {

  //参构造函数
  public StudyReflect() {
    System.out.println("Constructor:StudyReflect()");
  }

  public StudyReflect(String name) {
    System.out.println("Constructor:StudyReflect(String name)" + name);
  }

  private StudyReflect(List list[]) {
    System.out.println("Constructor:StudyReflect(List list)" + list.toString());
  }

  //方法
  public void method() {
    System.out.println("method:method()");
  }

  private int[] method(List list) {
    System.out.println("method:method(List list)" + list.toString());
    return new int[]{1, 2, 3};
  }

  public static void method(String[] args) {
    for (String arg :args) {
    System.out.println("arg = " + arg);
    }
    System.out.println("method:method(String string)" + args);
  }

  //属性或字段
  private String field = "fiedltest";

  public String getField() {
    return field;
  }

  public void setField(String field) {
    this.field = field;
  }
}


//测试类

package cn.study.reflect;

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

public class DemoReflect {

  public static void main(String[] args) throws Exception {

    System.out.println("------Class------");

    //装载类
    Class clazz = Class.forName("cn.study.reflect.StudyReflect");
    //其它加载方法
    //Class clazz1 = StudyReflect.class;
    //Class clazz2 = new StudyReflect().getClass();

    System.out.println("------Constructor------");

    //反射构造函数
    //public StudyReflect()
    Constructor c = clazz.getConstructor(null);
    Object obj = c.newInstance(null);
    System.out.println(obj.getClass());
    StudyReflect sr = (StudyReflect) obj;
    System.out.println(sr.getField());

    System.out.println("------------");

    //public StudyReflect(String name)
    Constructor c1 = clazz.getConstructor(String.class);
    StudyReflect sr1 = (StudyReflect) c1.newInstance("TestConstructor");
    System.out.println(sr1.getField());

    System.out.println("------------");

    //private StudyReflect(List list[])
    Constructor c2 = clazz.getDeclaredConstructor(List[].class);
    c2.setAccessible(true);  //暴力反射
    StudyReflect sr2 = (StudyReflect) c2.newInstance((Object) new List[4]);
    System.out.println(sr2.getField());

    System.out.println("------------");

    //public StudyReflect() 仅限无参构造函数
    StudyReflect sr3 = (StudyReflect) clazz.newInstance();
    System.out.println(sr3.getField());

    System.out.println("------------");
    //遍历
    Constructor[] cs = clazz.getDeclaredConstructors();
    for (Constructor cr :cs) {
        System.out.println(":" + cr.getName());
        Class[] pts = cr.getParameterTypes();
        for (Class pt :pts) {
            System.out.println(pt.getName());
        }
    }

    System.out.println("------Method------");

    //反射方法
    //public void method()
    Method m = clazz.getMethod("method", null);
    m.invoke(obj, null);

    System.out.println("------------");

    //private int[] method(List list)
    Method m1 = clazz.getDeclaredMethod("method", List.class);
    m1.setAccessible(true);
    int[] arr = (int[]) m1.invoke(sr1, new List());
    for (int v :arr) {
      System.out.println("V = " + v);
    }

    System.out.println("------------");

    //public static void method(String[] args)
    Method m2 = clazz.getMethod("method", String[].class);
    //可变参数要强制转换为一个参数对象
    m2.invoke(sr1, (Object)new String[]{"111", "222", "333"});

    System.out.println("------------");

    //遍历
    Method[] mts = clazz.getDeclaredMethods();
    for (Method mt :mts) {
        System.out.println(":" + mt.getName());
        System.out.println("Return:" + mt.getReturnType());
        Class[] pts = mt.getParameterTypes();
        for (Class pt :pts) {
            System.out.println(pt.getName());
        }
    }

    System.out.println("------Field------");

    //field
    Field f = clazz.getDeclaredField("field");
    f.setAccessible(true);
    System.out.println("field = " + f.get(sr1));
    f.set(sr1, "test");
    String field = (String) f.get(sr1);
    System.out.println("field = " + field);

  }

}


//结果

------Class------
------Constructor------
Constructor:StudyReflect()
class cn.study.reflect.StudyReflect
fiedltest
------------
Constructor:StudyReflect(String name)TestConstructor
fiedltest
------------
Constructor:StudyReflect(List list)[Ljava.awt.List;@23fc4bec
fiedltest
------------
Constructor:StudyReflect()
fiedltest
------------
:cn.study.reflect.StudyReflect
java.lang.String
:cn.study.reflect.StudyReflect
[Ljava.awt.List;
:cn.study.reflect.StudyReflect
------Method------
method:method()
------------
method:method(List list)java.awt.List[list0,0,0,0x0,invalid,selected=null]
V = 1
V = 2
V = 3
------------
arg = 111
arg = 222
arg = 333
method:method(String string)[Ljava.lang.String;@5013582d
------------
:getField
Return:class java.lang.String
:method
Return:void
[Ljava.lang.String;
:method
Return:class [I
java.awt.List
:method
Return:void
:setField
Return:void
java.lang.String
------Field------
field = fiedltest
field = test

阅读(325) | 评论(0) | 转发(0) |
0

上一篇:01-枚举学习

下一篇:Ubuntu下网卡聚合

给主人留下些什么吧!~~