资讯专栏INFORMATION COLUMN

Java的反射中一些重要的方法

eccozhou / 1547人阅读

摘要:中有个类,是所有类的继承根源,其内声明了数个应该在所有类中被改写的方法等。其中返回一个对象。对象表示的类或接口声明的所有方法,包括公共保护默认包访问和私有方法,但不包括继承的方法。

原理

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

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

实例 1. 准备工作

创建Person类

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对象

通过getClass()

Person person = new Person();
Class class2 = person.getClass();

通过Class.forName()

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

.class

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
*/

获取类属性的修饰符
上述代码中有一个方法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();

使用反射调用方法

method.invoke(对象,参数...)

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());

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65393.html

相关文章

  • 最最最常见Java面试题总结——第二周

    摘要:与都继承自类,在中也是使用字符数组保存字符串,,这两种对象都是可变的。采用字节码的好处语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。 String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的? String和StringBuffer、StringBuilder的区别 可变性...

    yearsj 评论0 收藏0
  • Java 注解实战

    摘要:注解是的一个新特性。很重要,生产中我们开发常用此值表示注解是否可被子元素继承。类注解方法注解通过反射获取方法对象此部分内容可参考通过反射获取注解信息注解处理器实战接下来我通过在公司中的一个实战改编来演示一下注解处理器的真实使用场景。 前言:Java 注解,对于很多人都不陌生了,但是在公司的实际开发中,可能让我们自己去定义注解并应用到生产环境中的机会比较少,所以会导致一部分人对注解的理解...

    Jochen 评论0 收藏0
  • 后端经验

    摘要:在结构上引入了头结点和尾节点,他们分别指向队列的头和尾,尝试获取锁入队服务教程在它提出十多年后的今天,已经成为最重要的应用技术之一。随着编程经验的日积月累,越来越感觉到了解虚拟机相关要领的重要性。 JVM 源码分析之 Jstat 工具原理完全解读 http://click.aliyun.com/m/8315/ JVM 源码分析之 Jstat 工具原理完全解读 http:...

    i_garfileo 评论0 收藏0
  • Java面试通关要点汇总集(基础篇之基本功,非原作者)

    摘要:面试通关要点汇总集部分解答说明如果你有幸能看到的话,本文整体框架来自阿里梁桂钊的博文,总结的非常不错。这样做的目的是对内部数据进行了不同级别的保护,防止错误的使用了对象的私有部分。被继承的类称为基类和父类或超类。 showImg(https://segmentfault.com/img/remote/1460000013442471?w=1280&h=819); Java面试通关要点汇...

    smallStone 评论0 收藏0
  • 后端ing

    摘要:当活动线程核心线程非核心线程达到这个数值后,后续任务将会根据来进行拒绝策略处理。线程池工作原则当线程池中线程数量小于则创建线程,并处理请求。当线程池中的数量等于最大线程数时默默丢弃不能执行的新加任务,不报任何异常。 spring-cache使用记录 spring-cache的使用记录,坑点记录以及采用的解决方案 深入分析 java 线程池的实现原理 在这篇文章中,作者有条不紊的将 ja...

    roadtogeek 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<