美文网首页
反射原理了解

反射原理了解

作者: 双囍_小赵 | 来源:发表于2022-12-29 16:28 被阅读0次

1.反射为什么比直接调用会耗时?

2.反射为什么耗性能?

往下看:

获取方法

获取Class对象的方法集合,主要有三种方法:

getDeclaredMethods(): 返回类或接口声明的所有方法:

包括公共,保护,默认(包)访问和私有方法不包括继承的方法

public Method[] getDeclaredMethods() throws SecurityException {}

getMethods(): 返回某个类所有的public方法,

包括继承类的public方法

public Method[] getMethods() throws SecurityException {}

getMethod(): 返回一个特定的方法

第一个参数 :方法名称

后面的参数 :方法的参数对应Class的对象

public Method getMethod(String name,Class... parameterType) {}

获得Class对象

使用Class类的forName静态方法:

public static Class forName(String className);/* 在JDBC中使用这个方法加载数据库驱动 */

Class.forName(driver);

直接获取一个对象的class:

Class klass=int.class;

Class classInt=Integer.TYPE;

调用对象的getClass()方法:

StringBuilder str=new StringBuilder("A");

Class klass=str.getClass();

判断是否是某个类的实例

一般来说,使用instanceof关键字判断是否为某个类的实例

在反射中,可以使用Class对象的isInstance() 方法来判断是否为某个类的实例,这是一个native方法

public native boolean isInstance(Object obj);

创建实例

通过反射生成对象的实例主要有两种方式:

使用Class对象的newInstance()方法来创建Class对象对应类的实例:

Class c = String.class;

Object str = c.newInstance();

先通过Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建实例: 可以用指定的构造器构造类的实例

/* 获取String所对应的Class对象 */

Class c=String.class;/* 获取String类带一个String参数的构造器 */

Constructor constructor=c.getConstructor(String.class);/* 根据构造器创建实例 */

Object obj=constructor.newInstance("abc");

System.out.println(obj);


获取构造器信息

通过Class类的getConstructor方法得到Constructor类的一个实例

Constructor类中newInstance方法可以创建一个对象的实例:

public T newInstance(Objec ... initargs)

newInstance方法可以根据传入的参数来调用对应的Constructor创建对象的实例


获取类的成员变量信息

getFileds: 获取公有的成员变量

getDeclaredFields: 获取所有已声明的成员变量,但是不能得到父类的成员变量


调用方法

从类中获取一个方法后,可以使用invoke() 来调用这个方法

public Object invoke(Object obj, Object ... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {}

示例:

public class InvokeTest {

public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {

Class klass = methodClass.class;

// 创建methodClass的实例

Object obj = klass.newInstance();

// 获取methodClass的add方法

Method method = klass.getMethod("add", int.class, int.class);

// 调用method对应的方法,实现add(1,4)

Object result = method.invoke(obj, 1, 4);

System.out.println(result);

}

}

class methodClass {

public final int n = 3;

public int add(int a, int b) {

return a + b;

}

public int sub(int a,int b) {

return a * b;

}

}

相关文章

  • 一探究竟:Java反射效率低的原因到底在哪?

    预备知识 了解 Java 反射基本用法 看完本文可以达到什么程度 了解 Java 反射原理及 Java 反射效率低...

  • 面试官说:大家都说 Java 反射效率低,你知道原因在哪里么

    预备知识 了解 Java 反射基本用法 看完本文可以达到什么程度 了解 Java 反射原理及 Java 反射效率低...

  • 反射原理了解

    1.反射为什么比直接调用会耗时? 2.反射为什么耗性能? 往下看: 获取方法 获取Class对象的方法集合,主要有...

  • 浅谈反射机制

    最近看了看反射,反射涉及的知识还是很广的,这里我们只是简单的了解一下。 反射机制 首先我们来了解一下反射的原理。具...

  • java反射机制

    java的反射机制大家用的比较多,但是对其原理可能不是很了解,本文简单介绍一下反射的原理,首先看一下简单的例子: ...

  • 华与华方法(8)传播第一原理

    传播三大原理: 第一原理:刺激反射原理 第二原理:播传原理 第三原理:信号能量原理。 一、刺激反射原理 所有传播都...

  • 深入 ProtoBuf - 反射原理解析

    在介绍了 ProtoBuf 序列化原理之后,本文介绍 ProtoBuf 的反射技术原理。 反射技术简介 对于反射大...

  • Java反射原理(Make Java Great)

    最近复习反射想了解背后的原理,才发现这趟水远比我想象中的深,也才发现反射的伟大之处。Reflect实际上是个Cla...

  • Java 反射 reflection

    spring源代码,其基本原理如依赖注入、aop、以及xml技术,动态反射机制 Reflection 学习反射原理...

  • java基础(反射)

    在学习Java的过程中,很多框架的原理都会涉及到反射知识,如果你对反射不太了解甚至都没看过,那么你的提升会有点慢。...

网友评论

      本文标题:反射原理了解

      本文链接:https://www.haomeiwen.com/subject/ockgyrtx.html