如何利用java反射顺序的从一个java类中得到其中定义的成员变量名或者方法

如何利用java反射顺序的从一个java类中得到其中定义的成员变量名或者方法,第1张

for (int i = 0; i < fieldslength; i++) {

Field field = fields[i];

String fieldName = fieldgetName();

Systemoutprintln("name====="+fieldName);

String firstLetter = fieldNamesubstring(0, 1)toUpperCase();

// 获得和属性对应的getXXX()方法的名字

String getMethodName = "get" + firstLetter + fieldNamesubstring(1);

// 获得和属性对应的getXXX()方法

Method getMethod = classTypegetMethod(getMethodName, new Class[]{});

// 调用原对象的getXXX()方法

Object value = getMethodinvoke(object, new Object[]{});

Systemoutprintln("value===="+value);

}

简单写了下,不知道是不是你要的。

import javalangreflectMethod;

import comsunorgapachebcelinternalutilClassLoader;

public static void main(String[] args) throws Exception {

ClassLoader classLoader = new ClassLoader( new String[] { "D:\\Cheiron\\Test\\bin" });//类根路径

Class<> cl = classLoaderloadClass("orgapachecommonslangStringUtils");//类名

Method method = clgetMethod("split", Stringclass, Stringclass);//类的方法

Systemoutprintln(methodgetName());//打印方法名

String[] arrS = (String[]) methodinvoke(null, "a,a", ",");//调用方法

for (String string : arrS) {//打印返回值

Systemoutprintln(string);

}

}

Java中要用到反射,首先就必须要获取到对应的class对象,在Java中有三种方法获取类对应的class对象。

1、通过类的class属性

2、通过类实例的getClass()方法获取

3、通过ClassforName(String className)方法获取

现在比如在package下有个类Calculator

public class Calculator{

public double add(double score1,double score2){

return score1 + score2;

}

public void print(){

Systemoutprintln("OK");

}

public static double mul(double score1,double score2){

return score1  score2;

}

}public class CalculatorTest {

public static void main(String[] args) throws Exception {

//通过类的class属性获取

Class<Calculator> clz = Calculatorclass;

//或者通过类的完整路径获取,这个方法由于不能确定传入的路径是否正确,这个方法会抛ClassNotFoundException

// Class<Calculator> clz = ClassforName("testCalculator");

//或者new一个实例,然后通过实例的getClass()方法获取

// Calculator s = new Calculator();

// Class<Calculator> clz = sgetClass();

//1 获取类中带有方法签名的mul方法,getMethod第一个参数为方法名,第二个参数为mul的参数类型数组

Method method = clzgetMethod("mul", new Class[]{doubleclass,doubleclass});

//invoke 方法的第一个参数是被调用的对象,这里是静态方法故为null,第二个参数为给将被调用的方法传入的参数

Object result = methodinvoke(null, new Object[]{20,25});

//如果方法mul是私有的private方法,按照上面的方法去调用则会产生异常NoSuchMethodException,这时必须改变其访问属性

//methodsetAccessible(true);//私有的方法通过发射可以修改其访问权限

Systemoutprintln(result);//结果为50

//2 获取类中的非静态方法

Method method_2 = clzgetMethod("add", new Class[]{doubleclass,doubleclass});

//这是实例方法必须在一个对象上执行

Object result_2 = method_2invoke(new Calculator(), new Object[]{20,25});

Systemoutprintln(result_2);//45

//3 获取没有方法签名的方法print

Method method_3 = clzgetMethod("print", new Class[]{});

Object result_3 = method_3invoke(new Calculator(), null);//result_3为null,该方法不返回结果

}

}

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象的方法的功能称为java语言的反射机制。 Java反射机制主要提供了以下功能:在运行时判定任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判定任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

运行时类型识别(Run-timeTypeIdentification,RTTI)主要有两种方式,一种是我们在编译时和运行时已经知道了所有的类型,另外一种是功能强大的“反射”机制。

要理解RTTI在Java中的工作原理,首先必须知道类型信息在运行时是如何表示的,这项工作是由“Class对象”完成的,它包含了与类有关的信息。类是程序的重要组成部分,每个类都有一个Class对象,每当编写并编译了一个新类就会产生一个Class对象,它被保存在一个同名的class文件中。在运行时,当我们想生成这个类的对象时,运行这个程序的Java虚拟机(JVM)会确认这个类的Class对象是否已经加载,如果尚未加载,JVM就会根据类名查找class文件,并将其载入,一旦这个类的Class对象被载入内存,它就被用来创建这个类的所有对象。一般的RTTI形式包括三种:

1传统的类型转换。如“(Apple)Fruit”,由RTTI确保类型转换的正确性,如果执行了一个错误的类型转换,就会抛出一个ClassCastException异常。

2通过Class对象来获取对象的类型。如

Classc=ClassforName(“Apple”);

Objecto=cnewInstance();

3通过关键字instanceof或ClassisInstance()方法来确定对象是否属于某个特定类型的实例,准确的说,应该是instanceof/ClassisInstance()可以用来确定对象是否属于某个特定类及其所有基类的实例,这和equals()/==不一样,它们用来比较两个对象是否属于同一个类的实例,没有考虑继承关系。

反射

如果不知道某个对象的类型,可以通过RTTI来获取,但前提是这个类型在编译时必须已知,这样才能使用RTTI来识别。即在编译时,编译器必须知道所有通过RTTI来处理的类。

使用反射机制可以不受这个限制,它主要应用于两种情况,第一个是“基于构件的编程”,在这种编程方式中,将使用某种基于快速应用开发(RAD)的应用构建工具来构建项目。这是现在最常见的可视化编程方法,通过代表不同组件的图标拖动到图板上来创建程序,然后设置构件的属性值来配置它们。这种配置要求构件都是可实例化的,并且要暴露其部分信息,使得程序员可以读取和设置构件的值。当处理GUI时间的构件时还必须暴露相关方法的细细,以便RAD环境帮助程序员覆盖这些处理事件的方法。在这里,就要用到反射的机制来检查可用的方法并返回方法名。Java通过JavaBeans提供了基于构件的编程架构。

第二种情况,在运行时获取类的信息的另外一个动机,就是希望能够提供在跨网络的远程平台上创建和运行对象的能力。这被成为远程调用(RMI),它允许一个Java程序将对象分步在多台机器上,昌平java培训认为这种分步能力将帮助开发人员执行一些需要进行大量计算的任务,充分利用计算机资源,提高运行速度。

第一种:通过forName()方法;

第二种:类class;

第三种:对象getClass()。

举例如下:

package

test;

public class Demo{

public static void

main(){

Class<> c1 = null;

Class<> c2 =

null;

Class<> c3 =

null;

//三种反射用实例化方式

try{

//最常用的一种形式

c1 =

ClassforName("testX");

}catch(ClassNotFoundException

e){

eprintStackTrace();

}

//通过Object类中的方法实例化

c2

= new X()getClass();

//通过类class实例化

c3 =

Xclass;

Systemoutprintln("类名:" + c1getName());

//得到类名

Systemoutprintln("类名:" + c2getName());

//得到类名

Systemoutprintln("类名:" + c3getName());

//得到类名

}

}

以上就是关于如何利用java反射顺序的从一个java类中得到其中定义的成员变量名或者方法全部的内容,包括:如何利用java反射顺序的从一个java类中得到其中定义的成员变量名或者方法、java 如何使用反射 加载指定路径下的类文件(.class)、关于用java反射调用一个类里面的方法并执行等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存