Java-从名称和调用方法创建对象
我需要编写一个Java代码,在给定类名的情况下,创建该类型的对象并对其调用方法 我使用了Java.lang.Class.cast(),但是这条指令返回一个对象,并且没有我想要在对象类中运行的方法(显然) 我发布了一些解释代码Java-从名称和调用方法创建对象,java,reflection,Java,Reflection,我需要编写一个Java代码,在给定类名的情况下,创建该类型的对象并对其调用方法 我使用了Java.lang.Class.cast(),但是这条指令返回一个对象,并且没有我想要在对象类中运行的方法(显然) 我发布了一些解释代码 import java.lang.reflect.*; public class Loader { public static void main(String[] args) throws Exception { String classNam
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);
}
}
import java.lang.reflect.*;
公共类加载器{
公共静态void main(字符串[]args)引发异常{
字符串className=“Test”;
类[]参数=新类[]{int.Class,int.Class};
Class klass=Class.forName(className);
构造函数Constructor=klass.getConstructor(参数);
objectobj=constructor.newInstance(新对象[]{10,20});
klass.getClass().cast(obj.Run();//就像您使用getConstructor()
获取Constructor
对象一样,您可以使用getMethod()
或getMethods()获取Method
对象
另一个选项是将对象强制转换(使用常规强制转换,您“永远”不需要使用Class.cast()
)到已知接口,并以常规方式调用它。使用此方法而不是klass.getClass().cast(obj.Run();
:
您需要检索该方法,就像对构造函数所做的那样,然后使用invoke
调用该方法,将调用该方法的对象作为第一个参数,将Object
数组作为第二个参数,以指定传递给该方法的任何参数(在您的情况下,这些参数是非参数)
public Method getMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException
您可以提供您的实例和所需的参数并获得结果。您还可以使用对象类方法,通过重写该方法,您可以访问类的普通方法,正如我们所知,对象类是所有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();
}
}
从name和call方法创建对象
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());
}
}
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();
}
}
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());
}
}