反射机制的基本用法

来源:互联网 发布:网络诽谤罪如何取证 编辑:程序博客网 时间:2024/06/06 11:03

1、java反射机制就是在运行状态下,对任意一个类,都能知道所有的属性和方法。

对于任意一个对象,都能调用其任意一个方法和属性。这种动态获取信息以及动态调用对象的方法的功能叫做java反射机制。

1.1 获取字节码对象的三种方式

(1)Object类中的getClass()方法:使用该中方式,必须要有具体的类,并且要创建对象(比较麻烦)

  Thing t = new Thing();

Class clazz = t.getClass();

(2)任何数据类型都具备一个静态属性.class来获取对应的Class对象

Class clazz = Thing.class;

(3)只要通过给定的类类 的字符串名称就可以获取该类,更为扩展。要用Class类中的方法完成,该方法就是forName

Class clazz = Class.forName(包名+类名);

2、反射机制获取Class中的构造函数

      String className = "com.jash.bean.Person";

        //找寻该名称类文件,并加载进内存,并产生Class对象

      Class clazz = Class.forName(classname);

//获取Person类的构造函数Person("jack",18);

clazz.getConstructor(String.class,int.calss);

       //产生该类的对象并对其进行初始化

      Object o = clazz.newInstance("jack",18);

3、反射机制获取Class中的属性

     Class clazz = Class.forName("com.jash.bean.Person");

      Field field = clazz.getField("age");//只能获取公有的

        field = clazz.getDeclaredField("age");//只获取本类,但包含私有。

//对私有字段的访问取消权限检查。暴力访问。

      fiel.setAccessible(true);

      Object obj = clazz.newInstance();

      field.set(obj,89);//设置obj对象中属性age的值为89

      Object o = field.get(obj);//获取obj对象中的属性age的值

      System.out.println(o);

3、反射机制获取Class中的公共函数(方法)

(1)获取所有方法

Class clazz = Class.forName("com.jsah.bean.Person");

Method[ ] methods = clazz.getMethods();//获取的都是公有的方法,1

methods = calzz.getDeclaredMethods();//获取本类中所有的方法,包含私有,2

for(Method method : methods){

System.out.println(method);

}

(2)获取指定的一般方法(无参的)

Class clazz = Class.forName("com.jsah.bean.Person");

        Method method = clazz.getMethod("show“,null);//获取空参数的一般方法

//Object obj = clazz.newInstance();//创建一个实例(方法一)

Constructor constructor = clazz.getConstructor(String.calss,int.class);

Object obj = constructor.newInstance("小明",37);//创建一个实例(方法二)

method.invoke(obj,null);//obj是本类的对象,因为show方法中没有传入参数,所以为空。

(3)获取指定的有参方法

Class clazz = Class.forName("com.jsah.bean.Person");

        Method method = clazz.getMethod("paramMethod“,String.class,int.class);//获取参数类型为String和int 的paramMethod方法

Object obj = obj.newInstance();

method.invoke(obj,"小明",39);

0 0
原创粉丝点击