我对这个类加载的概念还不熟悉,但我想尝试加载一个类并进行转换。
例如:
public class foo {
public void fah() {
System.out.println("blah");
}
}
现在我已经有了一个自定义类加载器,并返回一个Class。如何将返回的类转换为“foo”,以便我可以使用它的方法和变量。我已经看过Classes的getMethod()方法,是我应该使用的,而不是试图将它转换为Foo?
答案 0 :(得分:1)
您已经加载了Class,但是您需要实例化一个Object才能将其作为foo访问。
查看Class类的Java API文档,特别是newInstace()和getConstructor()方法,因为这些将是键。当您通过反射调用构造函数时,您将能够将结果转换为所需的类,然后将其视为foo的任何其他实例。
答案 1 :(得分:0)
如果你加载了这个类,你将有反射的东西来找到并用所需的参数调用方法。
答案 2 :(得分:0)
对于具有默认构造函数的类。你必须做这样的事情:
Class claz = Class.forName("com.a.b.C", true, classLoader);
Object[] paramObject = new Object[]{file};
Class<?>[]paramType = new Class[]{file.getClass()};
Method method = claz.getMethod("methodName", paramType);
method.invoke(claz.newInstance(), paramObject);
相应的java类将如下所示:
package com.a.b;
import java.io.File;
public class C {
public C(){}
public void methodName(File file){
}
}
用于构造函数的类:
尝试使用getConstructor()
获取适当的构造函数并在其上调用newInstace()
。
注意强>
使用反射API时始终牢记适当的类型。即Integer
!= int
,因为不存在自动装箱。
答案 3 :(得分:0)
如果你通过反射加载一个类,那是因为你在编译时不知道实际的类,所以在注释中看到(在另一个答案中):
Class c = loadClass("Foo");
Foo f = (Foo) c.newInstance();
毫无意义,因为您已经在类路径中静态访问Foo,只需执行
Foo f = new Foo();
当你没有对类的静态绑定访问时,你再次使用反射。 (或者不知道你是否这样做)考虑一下:
该类定义为
public class Foo implements SomeInterface {
public void fah() {
System.out.println("blah");
}
}
现在通过反射访问此Foo类,但保持为SomeInterface
对象。
Class c = loadClass("Foo");
SomeInterface i = (SomeInterface)c.newInstance();
这里我有一个由“Foo”实现的SomeInterface。我的代码是针对SomeInterface编译的,所以我可以引用接口中定义的方法,但我不知道实现类“Foo”是什么,而不是名称。