java中的反射,invoke方法详解

java中的反射,invoke方法详解,第1张

就是调用类中的方法,最简单的用法是可以把方法参数化,invoke(class, method)比如你Test类里有一系列名字相似的方法setValue1、setValue2等等。可以把方法名存进数组v[],然后循环里invoke(test,v[i]),就顺序调用了全部setValue

如:public class  MyTest{ public static void main(String[] args) { String [] names ={"tom","tim","allen","alice"};

Class<> clazz = Testclass; try   Method method = clazzgetMethod("sayHi", Stringclass);for(String name:names)methodinvoke(clazznewInstance(),name);} catch (NoSuchMethodException e) eprintStackTrace(); } catch (IllegalAccessExcepti eprintStackTrace( } catch (IllegalArgumentException  {eprintStackTrace();} catch (InvocationTargetException e)eprintStackTrace(); } catch (InstantiationException e {eprintStackTrace( }class Test{public void sayHi(String name){ Systemoutprintln("Hi "+name); }

属于重点,在系统中用到注解权限时非常有用,可以精确控制权限的粒度

注意:要想使用反射去读取注解,必须将Retention的值选为Runtime Java代码import javalangannotationAnnotation;import javalangreflectMethod;//读取注解信息public class ReadAnnotationInfoTest {    public static void main(String[] args) throws Exception {        // 测试AnnotationTest类,得到此类的类对象        Class c = ClassforName(comiwtxokhtdannotationAnnotationTest);        // 获取该类所有声明的方法        Method[] methods = cgetDeclaredMethods();        // 声明注解集合        Annotation[] annotations;        // 遍历所有的方法得到各方法上面的注解信息        for (Method method : methods) {            // 获取每个方法上面所声明的所有注解信息            annotations = methodgetDeclaredAnnotations();            // 再遍历所有的注解,打印其基本信息            Systemoutprintln(methodgetName());            for (Annotation an : annotations) {                Systemoutprintln(方法名为: + methodgetName() + 其上面的注解为: + anannotationType()getSimpleName());                Method[] meths = anannotationType()getDeclaredMethods();                // 遍历每个注解的所有变量                for (Method meth : meths) {                    Systemoutprintln(注解的变量名为: + methgetName());                }            }        }    }}

等你学过SSH之后你就明白为要用反射了,牛B的框架都是通过配置文件,即反射机制来做的

例如吧,你想把a对象放到b对象中,但是你并不知道B对象的方法名叫什么

,或者并不知道用户会将方法名定义成什么

这个时候,你只需要在配置文件中,或者是用注解,写上去那么通过反射就可以得到某个方法了

反射机制是比较高级的东西,你还是踏踏实实的吧,

就这么说你可以理解不了,也并不知道他的意义在哪,

只有等你接触的框架,代码多了自然会明白他的作用

很多朋友都想知道java怎么获取注解的值?下面就一起来了解一下吧~

1、定义一个注解,用于给全局变量field字段赋值

package comhahastudyannotationvalue; import javalangannotationDocumented; import javalangannotationElementType; import javalangannotationRetention; import javalangannotationRetentionPolicy; import javalangannotationTarget; /  description: 定义一个注解,用于给 全局变量 field 字段 赋值,并使用反射取值。 

 特别提醒: @Rentention(RetentionPolicyRUNTIME) 时,注解才会被jvm加载,才能使用反射获取。  @version v10  @author w  @date 2018年8月1日下午2:37:40 / @Documented @Retention(RetentionPolicyRUNTIME) @Target(value=ElementTypeFIELD) public @interface Fields { int sort() default 0 ; String value() ; }

2、创建一个普通的类,使用 @ConsAnnotation、@Fields 注解

package comhahastudyannotationvalue; /  description: 创建一个普通的类,使用 @ConsAnnotation、@Fields 注解。  @version v10  @author w  @date 2018年8月1日下午2:50:23 / @ConsAnnotation(request = { "hello","world","annotation!" }) public class User { @Fields("中华人民共和国") private String userName; public String getUserName() { return userName; } public void setUserName(String userName) { thisuserName = userName; } }

3、针对 comhahastudyannotationvalueUser 类使用注解的测试

package comhahastudyannotationvalue; import javalangreflectField; import javautilArrays; /  description: 针对 comhahastudyannotationvalueUser 类使用注解的测试  @version v10  @author w  @date 2018年8月1日下午2:37:13 / public class ValueTest { public static void main(String[] args) throws Exception { User user = new User(); // 1、 获取 User类上的注解 @ConsAnnotation ConsAnnotation anno = usergetClass()getAnnotation(ConsAnnotationclass); String[] arr = annorequest(); Systemoutprintln(ArraystoString(arr)); // [hello, world, annotation!] // 2、 获取User类中 private String userName; 变量上的注解 @Field Field f = usergetClass()getDeclaredField("userName"); Fields anno2 = fgetAnnotation(Fieldsclass); usersetUserName(anno2value()); Systemoutprintln(usergetUserName()); // 中华人民共和国 } }

一、反射的概述

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

要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法所以先要获取到每一个字节码文件对应的Class类型的对象

以上的总结就是什么是反射

反射就是把java类中的各种成分映射成一个个的Java对象

例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。(其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)

如图是类的正常加载过程:反射的原理在与class对象。

熟悉一下加载的时候:Class对象的由来是将class文件读入内存,并为之创建一个Class对象。

二、Java中为什么需要反射?反射要解决什么问题?

Java中编译类型有两种:

静态编译:在编译时确定类型,绑定对象即通过。

动态编译:运行时确定类型,绑定对象。动态编译最大限度地发挥了Java的灵活性,体现了多态的应用,可以减低类之间的耦合性。

Java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public、static等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。

Reflection可以在运行时加载、探知、使用编译期间完全未知的classes。即Java程序可以加载一个运行时才得知名称的class,获取其完整构造,并生成其对象实体、或对其fields设值、或唤起其methods。

反射(reflection)允许静态语言在运行时(runtime)检查、修改程序的结构与行为。

在静态语言中,使用一个变量时,必须知道它的类型。在Java中,变量的类型信息在编译时都保存到了class文件中,这样在运行时才能保证准确无误;换句话说,程序在运行时的行为都是固定的。如果想在运行时改变,就需要反射这东西了。

实现Java反射机制的类都位于javalangreflect包中:

Class类:代表一个类

Field类:代表类的成员变量(类的属性)

Method类:代表类的方法

Constructor类:代表类的构造方法

Array类:提供了动态创建数组,以及访问数组的元素的静态方法

一句话概括就是使用反射可以赋予jvm动态编译的能力,否则类的元数据信息只能用静态编译的方式实现,例如热加载,Tomcat的classloader等等都没法支持。

三、使用

1、获取Class对象的三种方式

11 Object ——> getClass();

12 任何数据类型(包括基本数据类型)都有一个“静态”的class属性

13 通过Class类的静态方法:forName(String  className)(常用)

希望对您有所帮助!~

@Retention(RetentionPolicyRUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到

@Target({ElementTypeFIELD,ElementTypeMETHOD})//定义注解的作用目标作用范围字段、枚举的常量/方法

@Documented//说明该注解将被包含在javadoc中

public @interface FieldMeta {

/

是否为序列号

@return

/

boolean id() default false;

/

字段名称

@return

/

String name() default "";

/

是否可编辑

@return

/

boolean editable() default true;

/

以上就是关于java中的反射,invoke方法详解全部的内容,包括:java中的反射,invoke方法详解、Java 注解的读取注解信息的方法、java 什么情况下是用反射的获取方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9742139.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存