2017-08-10 64 views
0

我有一個類如何防止保護成員

package java.util; 

public class xyz { 
    void method(){ 
     ArrayList<String> al = new ArrayList<>(); 
     al.elementData = new Object[10]; 
     System.out.println(al.elementData); 
    } 

    public static void main(String[] args) { 
     xyz z = new xyz(); 
     System.out.println("hello"); 
     z.method(); 
    } 
} 

的訪問時,我嘗試運行它,我得到一個異常像下面

objc[6598]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/bin/java and /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be used. Which one is undefined. 
Error: A JNI error has occurred, please check your installation and try again 
Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.util 
    at java.lang.ClassLoader.preDefineClass(ClassLoader.java:662) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:761) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) 
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495) 

假設在公司FOO我們開發和運輸罐文件稱爲foo.jar給客戶端。現在,客戶端可以訪問com.foo.pack.TestClass中的受保護成員,只需將它添加到classpath中,然後在類中聲明package com.foo.pack;,就像上面的示例中的xyz.class一樣,我可以訪問ArrayList.java的elementData

我的問題是,如何防止公司FOO受保護成員的訪問或使用或可見性。

+1

歡迎來到java編程。您無法阻止訪問受保護的成員。只有私人阻止訪問,並不會爲你想要的。 – DwB

+0

我看到的一種方法是,不能讓他們通過客戶端/開發者/用戶的類加載器加載公司的類。他們可以編寫代碼並編譯代碼,但是他們無法運行它,因爲他們無法加載類。但問題是如何實施這種方法! – Pushparaj

回答

-1

通過反思,您可以訪問甚至修改私人成員。這很常見(只需檢查依賴注入的@Autowired註釋)。

我不確定你想要達到什麼效果,但是如果你想防止客戶端進行逆向工程,試着用一些工具來混淆你的代碼。

0

密封清單中的包,並簽署JAR文件。

+0

如果你簽字,那麼你不能加載它們 – Pushparaj