簡體   English   中英

Java-將私有類傳遞給方法

[英]Java - Pass private class to a method

因此,我有一個簡潔的小函數,當我的函數不知道它們將要處理什么類時,可以使用它來構造對象。 (是的,在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;
    }
}

無論如何,我有一個在另一個類文件中聲明的類,我希望主類能夠傳遞給此函數。

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在此類之外對我的構造函數不可見嗎?

如果FunctionsaClass (假設otherClass是在同一個文件aClass )都在同一個包,你的代碼不會引發任何異常。 ITOH,如果這兩個類不在同一包中,則有一個例外:

java.lang.IllegalAccessException: Class pack1.Functions can not access a member of class pack2.otherClass with modifiers "public"

otherClass的構造otherClasspublic ,可以通過反射找到,但是該類本身具有包的私有可見性。 這就是為什么Functions#Construct(...)無法實例化它的原因。

如果您確實想通過反射包私有類實例化,則可以使用setAccessibility(true)繞過訪問安全性檢查,如javadoc中所述,並由@Anuj建議

值為true表示反射的對象在使用時應禁止Java語言訪問檢查。

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;
    }
}

如果上下文不使用安全管理器,則可以嘗試通過反射使構造函數可訪問。

con.setAccessible(true);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM