课程咨询 :186-8884-0703
咨询QQ:1615412715

深圳Java培训 > 达内新闻 > 【达内JAVA学堂】Java的反射原理详解
  • 【达内JAVA学堂】Java的反射原理详解

    发布:深圳Java培训      来源:达内新闻      时间:2016-01-19

  • 达内深圳JAVA培训【达内JAVA学堂】应广大深圳JAVA培训学员的需要,特为参加培训的学员策划了“Java的反射原理详解专题等有关资料,供学员参考!

    原理

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

    Java中有个Object 类,是所有Java 类的继承根源,其内声明了数个应该在所有Java 类中被改写的方法:hashCode、equals、clone、toString、getClass等。其中getClass返回一个Class 对象。Class对象十分特殊。他是Java中所有类的实例,借助它可以实现对一个对象的操作。

    1. 准备工作

    public class Person {

    private String name;

    private String age;

    private void shot{

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

    }

    protected void shot1 {

    System.out.println("111");

    }

    public String getAge {

    return age;

    }

    public String getName {

    return name;

    }

    public void setAge(String age) {

    this.age = age;

    }

    public void setName(String name) {

    this.name = name;

    }

    }

    2. 创建Class对象

    Person person = new Person;

    Class class2 = person.getClass;

    Class class1 = Class.forName("test0118.testR.Person");

    Class class3 = Person.class;

    3. 对对象属性进行操作

    获取类的属性

    getFields只能访问类中声明为公有的字段,私有的字段它无法访问,能访问从其它类继承来的公有方法.

    getDeclaredFields能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法

    Field fields = class1.getDeclaredFields;

    Field fields2 = class1.getFields;

    for (Field field : fields) {

    System.out.println(Modifier.toString(field.getModifiers) + field.getName);

    }

    for(Field field:fields2){

    System.out.println(Modifier.toString(field.getModifiers)+field.getName);//由于Person类中并没有公有字段,所以该循环不输出任何值

    }

    /**

    输出:

    privatename

    privateage

    */

    【达内JAVA学堂】Java的反射原理详解

    获取类属性的修饰符

    上述代码中有一个方法Modifier.toString(field.getModifiers)即是获取该属性的修饰符,field.getModifiers返回一个int值,将该值转化为对应的描述要用到Modifier.toString方法。

    对类的属性进行操作

    Field field = class1.getField("name");

    Object object = class1.newInstance;

    field.setAccessible(true);//打破了封装的特性,允许对私有属性直接进行操作

    field.set(object, "123");

    System.out.println(field.get(object));

    获取类的方法

    getMethods返回某个类的所有公用(public)方法包括其继承类的公用方法,当然也包括它所实现接口的方法。

    getDeclaredMethods对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。当然也包括它所实现接口的方法。

    Method methods = class1.getDeclaredMethods;

    Method methods2 = class1.getMethods;

    获取方法的参数和返回值的类型

    method.getParameterTypes:获取方法参数类型,返回Class数组

    method.getReturnType:获取方法返回值类型,返回Class对象

    Class ty = method.getParameterTypes;

    Class rty = method.getReturnType;

    Object object = class1.newInstance;

    Method method = class1.getMethod("setName", Class.forName("java.lang.String"));

    method.invoke(object, "123123");

    Method method2 = class1.getMethod("getName");

    System.out.println((String) method2.invoke(object));

    System.out.println(method.getReturnType);

    更多内容请点击【深圳JAVA培训】

上一篇:Java 企业级应用延伸

下一篇:Java反序列化工具

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:4月28日

Java--零基础周末班

Java--零基础周末班

开班日期:4月28日

Java--大数据全日制班

Java--大数据全日制班

开班日期:4月28日

Java--大数据周末班

Java--大数据周末班

开班日期:4月28日

  • 地址:深圳市宝安区共乐路西乡商会大厦10楼——深圳JAVA培训中心宝安校区
    深圳市龙岗区横岗力嘉路2013文化创客园A栋——深圳JAVA培训中心龙岗校区
  • 课程培训电话:186-8884-0703
    咨询QQ:1615412715 全国免费咨询热线:400-111-8989
  • 2001-2016 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56