铸造加载类

时间:2011-04-26 17:25:52

标签: java eclipse casting classloader

我对这个类加载的概念还不熟悉,但我想尝试加载一个类并进行转换。

例如:

public class foo {
    public void fah() {
        System.out.println("blah");
    }
}

现在我已经有了一个自定义类加载器,并返回一个Class。如何将返回的类转换为“foo”,以便我可以使用它的方法和变量。我已经看过Classes的getMethod()方法,是我应该使用的,而不是试图将它转换为Foo?

4 个答案:

答案 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”是什么,而不是名称。