2014-10-09 66 views
1

在一个目录下,我已经定义了以下文件A.java:创建非公共类外包装的对象

package test; 
public class A {} 
class B { 
    public void hello() { 
     System.out.println("Hello World"); 
    } 
} 

从不同的目录,如果我做到以下几点:

import test.B; 
public class X { 
    public static void main(String [] args) { 
     B b = new B(); 
     b.hello(); 
    } 
} 

和编译javac X.java,我得到以下错误:

X.java:2: test.B is not public in test; cannot be accessed from outside package 
import test.B; 
     ^

X.java:7: test.B is not public in test; cannot be accessed from outside package 
    B b = new B(); 
^

X.java:7: test.B is not public in test; cannot be accessed from outside package 
    B b = new B(); 
      ^

我不能改变PAC来源凯奇测试。我该如何解决这个问题?

+0

你尝试过什么? B是A的非静态内部类,因此至少需要A的实例来创建B的实例。但是,您的B类在测试包外部不可用,所以我不确定你想在这里做什么。 – 2014-10-09 13:39:04

+0

事实上,我正在尝试的东西很蹩脚,但对于我正在试验的东西来说是必要的。用反思的答案给了我一个合理的解决方案。谢谢! – user1539577 2014-10-09 17:23:35

+0

反射在这种情况下是疯狂的,但okie dokie! – 2014-10-09 17:24:48

回答

1

使用反射:

package test2; 

public class Main { 
    public static void main(String[] args) throws Exception { 
     java.lang.reflect.Constructor<?> bConstructor = Class.forName("test.B").getConstructor(/* parameter types */); 
     bConstructor.setAccessible(true); 
     Object b = bConstructor.newInstance(/* parameters */); 

     java.lang.reflect.Method hello = b.getClass().getMethod("hello"); 
     hello.setAccessible(true); 
     hello.invoke(b); 
    } 
} 
2

默认访问修饰符 OR 没有修饰符指定的成员declared package的package.So外的情况下,只有访问,但不B只是内部package命名test访问。阅读更多关于Access Modifiers

如果你不能更改包test.Than中的源代码,请将代码/类移动到test包。

2

在Java中,有4 different scope accessibilities

Modifier Class Package Subclass World 
public  Y  Y  Y   Y 
protected  Y  Y  Y   N 
no modifier Y  Y  N   N 
private  Y  N  N   N 

在你的情况,B没有修饰符,这意味着它可以在类中,只有包装里面看到。因此,如果您创建其他包的类X,则不会看到B

接取B,你需要定义一个类,它是同一个包内的B而你的情况是包test