最近在玩JVM怎么是實(shí)現(xiàn)反射?遇到了一個(gè)坑,寫出來驚醒下自己均驶。
import java.lang.reflect.Method;
public class Test {
public static void target(int i) {
new Exception("#" + i).printStackTrace();
}
public static void main(String[] args) throws Exception {
Class<?> klass = Class.forName("Test");
Method method = klass.getMethod("target", int.class);
method.invoke(null, 0);
}
}
報(bào)錯(cuò)了:
Exception in thread "main" java.lang.ClassNotFoundException: Test
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at com.huibo.cloud.mock.exam.controller.Test.main(Test.java:11)
那是因?yàn)槊臻g的問題,所以找不到類粉楚。這里名字要寫全路徑名辣恋。
Class<?> klass = Class.forName("com.mock.Test");
或者
Test test = new Test();
Class<? extends Test> klass = test.getClass();
在 Java 中獲取 Class 對(duì)象常見的有這么三種。
- 使用靜態(tài)方法 Class.forName 來獲取模软。
- 調(diào)用對(duì)象的 getClass() 方法伟骨。
- 直接用類名 +“.class”訪問。對(duì)于基本類型來說燃异,它們的包裝類型(wrapper classes)擁有一個(gè)名為“TYPE”的 final 靜態(tài)字段携狭,指向該基本類型對(duì)應(yīng)的 Class 對(duì)象。