我需要编写一个Java代码,给定一个类名,创建该类型的对象并在其上调用一个方法。
我使用了Java.lang.Class.cast(),但是这个指令返回一个Object,并且没有我想在Object类中运行的方法(显然)。
我张贴了一些代码来解释
import java.lang.reflect.*;
public class Loader {
public static void main(String[] args) throws Exception {
String className = "Test";
Class[] arguments = new Class[] { int.class, int.class };
Class klass = Class.forName(className);
Constructor constuctor = klass.getConstructor(arguments);
Object obj = constuctor.newInstance(new Object[] { 10, 20 });
klass.getClass().cast(obj).Run(); // <----- PROBLEM
// this works: ((Test)obj).Run();
}
}
class Test {
int a, b;
public Test(int a1, int b1) {
a = a1; b = b1;
}
public void Run() {
System.out.println("Run...");
System.out.println(a + " " + b);
}
}
就像您使用getConstructor()
来获得Constructor
对象一样,您可以使用getMethod()
或getMethods()
来获得Method
对象。
Method m = klazz.getMethod("methodName", parameters); // Parameters optional
m.invoke(obj, parameters); // Ditto
另一种选择是将对象强制转换(使用常规强制转换,您"永远"不需要使用Class.cast()
)到已知接口,并以常规方式调用它。
根据名称和调用方法创建对象
public interface Element {
int getId();
String getName();
String getFamily();
}
public class Person implements Element {
private int Id;
private String name;
private String family;
public Person() {
}
public Person(int id, String name, String family) {
Id = id;
this.name = name;
this.family = family;
}
@Override
public int getId() {
return Id;
}
@Override
public String getName() {
return name;
}
@Override
public String getFamily() {
return family;
}
public void setId(int id) {
Id = id;
}
public void setName(String name) {
this.name = name;
}
public void setFamily(String family) {
this.family = family;
}
}
从名称和调用方法创建对象:
public static void main(String[] args) {
try {
String classImportName = "database.test.Person";
Class objClass = Class.forName(classImportName);
Constructor constuctor = objClass.getConstructor();
Object obj = constuctor.newInstance();
Method callMethod = obj.getClass().getDeclaredMethod("setFamily", String.class);
callMethod.setAccessible(true);
callMethod.invoke(obj, "test");
/*Field field = obj.getClass().getDeclaredField("family");
field.setAccessible(true);
field.set(obj,"delphani");*/
Element elm = (Element) obj;
System.out.println(elm.getFamily());
//In the case the person class does not implement the 'element' Interface
Method callMethod2 = obj.getClass().getDeclaredMethod("getFamily");
callMethod2.setAccessible(true);
String res = (String) callMethod2.invoke(obj);
System.out.println("Result : " + res);
}
catch (Exception ex)
{
System.out.println(ex.getMessage());
}
}
用这个代替klass.getClass().cast(obj).Run();
:
try {
Method method = klass.getMethod("Run");
method.invoke(obj, new Object[0]);
} catch (Exception ex) {
ex.printStackTrace();
}
您需要检索该方法,就像您为构造函数所做的那样,然后使用invoke
调用该方法,并使用您正在调用该方法的对象作为第一个参数,并使用Object
数组作为第二个参数来指定传递给该方法的任何参数(在您的情况下不是)。
一旦你有了这个类和它的一个实例,你可以尝试使用Class
的这个方法来找到特定的方法:
public Method getMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException
提供方法的名称和期望的参数。如果一切顺利,您将找到它,并可以使用Method
类中的这个方法调用它:
public Object invoke(Object obj, Object... args)
您提供您的实例和您需要的参数,并获得结果。
你也可以使用Object类方法通过重写该方法你可以访问类的普通方法我们知道Object类是所有java类的超类通过重写特定方法你可以以
的形式进入你的类 class hello{
public int hashCode(){
fun();
}
public void fun(){
System.out.println("Successfully Enter in class");
}
}
class call{
public static void main(String[] args)
{
Class.forName("hello").newInstance().hashCode();
}
}