java怎么用字符串为类名获得一个实例

java怎么用字符串为类名获得一个实例,第1张

可以用到java反射机制,Class和Method这些类。 动态调用的方法:agetClass()getMethod(str, new Class[]{})invoke(a, new Object[]{})

其中,a为类的对象,str为要被调用的方法名

1、agetClass()得到aclass 对象 ;

2、getMethod(str, new Class[]{})得到a对象中名为str的不带参数的方法;

如果str方法带参数如str(String s, int i),就要这样写getMethod(str, new Class[]{Stringclass,intclass}) 。

3、invoke(a,new Object[]{})调用方法,第一个参数是要调用这个方法的对象,如果方法是static的,这个参数可以为null

如果调用有参数的方法str(String s, int i),应该这样写:invoke(a,new Object[]{"jimmy", 1})。

类名class 的方式更加安全,例如当你要获取一个接口的class时,可以使用 类名class 的方式获取

但此时就不能通过 对象getClass 的方式获取了,因为接口是没有实例对象的,接口只有实现类对象,通过这种方式获取到的是接口的实现类的class,而非是接口的class

再者就是对象声明的类型未必是对象本身真正的类型,通过对象获取class容易产生混乱,因此尽量使用更加安全的方式

可以使用以下代码来获取src目录下所有的包名,类名,方法名 以及通过一个类名获得该类下的所有方法名。

import javaioFile;

import javalangreflectMethod;

public class LoopApp {

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

String packageName = "";

File root = new File(SystemgetProperty("userdir") + "\\src");

loop(root, packageName);

}

public static void loop(File folder, String packageName) throws Exception {

File[] files = folderlistFiles();

for (int fileIndex = 0; fileIndex < fileslength; fileIndex++) {

File file = files[fileIndex];

if (fileisDirectory()) {

loop(file, packageName + filegetName() + "");

} else {

listMethodNames(filegetName(), packageName);

}

}

}

public static void listMethodNames(String filename, String packageName) {

try {

String name = filenamesubstring(0, filenamelength() - 5);

Object obj = ClassforName(packageName + name);

Method[] methods = objgetClass()getDeclaredMethods();

Systemoutprintln(filename);

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

Systemoutprintln("\t" + methods[i]getName());

}

} catch (Exception e) {

Systemoutprintln("exception = " + egetLocalizedMessage());

}

}

}

ClassforName()是根据类名称加载类 比如有一个类名为comabcAAA 此处ClassforName(‘comabcAAA ’)newInstance()就会创建一个AAA对象而class一般用来获取类的通用属性 比如AAAclassgetDeclareMethod()是获取AAA类的所有声明的方法 主要用于反射机制

以上就是关于java怎么用字符串为类名获得一个实例全部的内容,包括:java怎么用字符串为类名获得一个实例、Java中类名.class和对象.getclass有什么区别、java怎么获取src目录下所有的包名,类名,方法名 以及通过一个类名获得该类下的所有方法名等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/web/9288190.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存