Java - 将私有 class 传递给方法
Java - Pass private class to a method
所以我有一个简洁的小函数,当我的函数不知道它们要处理什么时,我可以用它来构造对象。classes。 (是的,在 Soritos 或其他任何人想告诉我我不合逻辑之前,我确实有一些很好的用途)
public static Object Construct(Class type, Class[] params, Object[] values){
//Create an object of any class
try{
Constructor con = type.getConstructor(params);
Object o = con.newInstance(values);
return o;
}
catch(Exception e){
System.out.println("CONSTRUCTOR EXCEPTION");
return null;
}
}
无论如何,我在另一个 class 文件中声明了一个 class,我希望主 class 能够传递给此函数。
public class aClass {
public aClass(String S, String s){
Class c = otherClass.class;
Object o = Functions.Construct(c, new Class[]{String.class, String.class}, new Object[]{S, s});
}
}
class otherClass{
public otherClass(String arg1, String arg2){}
}
但是我得到了一个例外。这是因为 otherClass 在这个 class 之外对我的构造函数不可见吗?
如果您的上下文不使用安全管理器,您可以尝试通过反射访问构造函数。
con.setAccessible(true);
如果 Functions
和 aClass
(假设 otherClass
与 aClass
在同一个文件中)在同一个包中,您的代码不会引发任何异常。 ITOH,如果这2个class不在同一个包里,就会有例外:
java.lang.IllegalAccessException: Class pack1.Functions can not access a member of class pack2.otherClass with modifiers "public"
otherClass
的构造函数是public
,是通过反射找到的,但是class本身有package private可见性。这就是为什么 Functions#Construct(...)
不能实例化它。
如果你真的想通过反射包私有 classes 实例化,你可以使用 setAccessibility(true)
绕过访问安全检查,如 javadoc 中所述和@Anuj[ 所建议的=22=]
A value of true indicates that the reflected object should suppress Java language access checking when it is used.
public static Object Construct(Class type, Class[] params, Object[] values){
//Create an object of any class
try{
Constructor con = type.getConstructor(params);
con.setAccessible(true);
Object o = con.newInstance(values);
return o;
}
catch(Exception e){
System.out.println("CONSTRUCTOR EXCEPTION");
return null;
}
}
所以我有一个简洁的小函数,当我的函数不知道它们要处理什么时,我可以用它来构造对象。classes。 (是的,在 Soritos 或其他任何人想告诉我我不合逻辑之前,我确实有一些很好的用途)
public static Object Construct(Class type, Class[] params, Object[] values){
//Create an object of any class
try{
Constructor con = type.getConstructor(params);
Object o = con.newInstance(values);
return o;
}
catch(Exception e){
System.out.println("CONSTRUCTOR EXCEPTION");
return null;
}
}
无论如何,我在另一个 class 文件中声明了一个 class,我希望主 class 能够传递给此函数。
public class aClass {
public aClass(String S, String s){
Class c = otherClass.class;
Object o = Functions.Construct(c, new Class[]{String.class, String.class}, new Object[]{S, s});
}
}
class otherClass{
public otherClass(String arg1, String arg2){}
}
但是我得到了一个例外。这是因为 otherClass 在这个 class 之外对我的构造函数不可见吗?
如果您的上下文不使用安全管理器,您可以尝试通过反射访问构造函数。
con.setAccessible(true);
如果 Functions
和 aClass
(假设 otherClass
与 aClass
在同一个文件中)在同一个包中,您的代码不会引发任何异常。 ITOH,如果这2个class不在同一个包里,就会有例外:
java.lang.IllegalAccessException: Class pack1.Functions can not access a member of class pack2.otherClass with modifiers "public"
otherClass
的构造函数是public
,是通过反射找到的,但是class本身有package private可见性。这就是为什么 Functions#Construct(...)
不能实例化它。
如果你真的想通过反射包私有 classes 实例化,你可以使用 setAccessibility(true)
绕过访问安全检查,如 javadoc 中所述和@Anuj[ 所建议的=22=]
A value of true indicates that the reflected object should suppress Java language access checking when it is used.
public static Object Construct(Class type, Class[] params, Object[] values){
//Create an object of any class
try{
Constructor con = type.getConstructor(params);
con.setAccessible(true);
Object o = con.newInstance(values);
return o;
}
catch(Exception e){
System.out.println("CONSTRUCTOR EXCEPTION");
return null;
}
}