使用class.forname()是不是可以在jvm里找到这个class然后再去使用?( ---------- 测试成功: public class OuterClass { private class PrivateClass { public String field; } }public class Test { public static void main(String []args) { try { Class clazz=Class.forName("OuterClass$PrivateClass"); System.out.println(clazz.getDeclaredFields()[0].getName()); } catch (Exception e) { e.printStackTrace(); } }
谁说不可以? 看以下代码: /** * 这是接口 * */ public interface TestInterface { public void doPrint(); }
/** * 这是父类 * */ public class Father {
public TestInterface getFathersPrivat(){ return new FathersPrivate(); }
public Father(){
} /** * 这是夫类中的private类 * */ class FathersPrivate implements TestInterface{ public void doPrint(){ System.out.println("我爱的人不爱我,唉…………"); } } }
/** * 这是子类 * */ public class Children extends Father{ private TestInterface mytest = super.getFathersPrivat();//这是调用夫类中的private类
public Children(){ this.mytest.doPrint();//结果是:"我爱的人不爱我,唉…………"
}
public static void main(String[] src){ new Children();//运行了看结果 } }
----------
测试成功:
public class OuterClass {
private class PrivateClass {
public String field;
}
}public class Test {
public static void main(String []args) {
try {
Class clazz=Class.forName("OuterClass$PrivateClass");
System.out.println(clazz.getDeclaredFields()[0].getName());
} catch (Exception e) {
e.printStackTrace();
}
}
看以下代码:
/**
* 这是接口
* */
public interface TestInterface {
public void doPrint();
}
* 这是父类
* */
public class Father {
public TestInterface getFathersPrivat(){
return new FathersPrivate();
}
public Father(){
}
/**
* 这是夫类中的private类
* */
class FathersPrivate implements TestInterface{
public void doPrint(){
System.out.println("我爱的人不爱我,唉…………");
}
}
}
* 这是子类
* */
public class Children extends Father{
private TestInterface mytest = super.getFathersPrivat();//这是调用夫类中的private类
public Children(){
this.mytest.doPrint();//结果是:"我爱的人不爱我,唉…………"
}
public static void main(String[] src){
new Children();//运行了看结果
}
}
啊
我才真的服了你了,FathersPrivate是Father的private class(你在FathersPrivate前面加private 我的代码照样可以运行,不行你可以下载运行),因为一个显而易见的原因,FathersPrivate是不能被Father的子类Children调用的,所以我们不能使用一般的类调用。这是我们应该想到接口,由于private class FathersPrivate是可以实现接口的,于是我们可以通过向上转型来运行private class FathersPrivate 中的方法,这其实是简单工厂模式的一种变形。而且我觉得这和反射没有一点联系,也不用去反射。
我以上贴的代码是可以运行的,在另一个public class中运行结果为:我爱的人不爱我,唉…………大家可以看看,这是private class FathersPrivate 的方法结果(我忘了在FathersPrivate 前面加private ,大家可以加上,运行是一样可以的,再顺便说一句,如果代码没有测试过、或是测试出错了,我不会对自己那么有自信,毕竟我不是**的,贴代码出来拿给大家骂!)。
yinwenjie(java入门中)
我没说你这种方式不能调用到父类子类中的内容,可你这种方式还用得着说么,什么内容不能通过公共接口访问还有简单工厂又叫静态工厂 再有,如果不用接口,你该怎么做呢
--------------------------------------
呵呵,static的可以不代表所有都可以啊.再说,没有默认构造函数怎么办?默认构造函数不是public又怎么办?
----------
测试成功:
public class OuterClass {
private class PrivateClass {
public String field;
}
}public class Test {
public static void main(String []args) {
try {
Class clazz=Class.forName("OuterClass$PrivateClass");
System.out.println(clazz.getDeclaredFields()[0].getName());
} catch (Exception e) {
e.printStackTrace();
}
}
--------
还是不大明白,就算知道了private class的方法你怎么调用呢?
也是个不小的问题呢!
回复人: jFresH_MaN(Contributing to Eclipse) ( ) 信誉:214
的方法是可以,但是,不能使用反射的方式去使用这个类,比如创建对象,访问方法等.建议如果有必要 如jFresH_MaN说的 setAccessible(true);来处理,但这个有可能会引发安全异常(记不太清名字了)
clazz=Class.forName("org.mozilla.javascript.tools.debugger.Dim$DimIProxy");
Method withContext = clazz.getDeclaredMethod("withContext",new Class[] { });
Field actionUrl = clazz.getDeclaredField("url");
Field actionText = clazz.getDeclaredField("text");
System.out.println(" test 1:"+withContext.toString());
Constructor DConStruc = clazz.getDeclaredConstructor(new Class[] {Dim.class,int.class });
Object[] args = new Object[] { DebugMain.dim, new Integer(IPROXY_EVAL_SCRIPT)} ;
System.out.println(" test 2:"+DConStruc.toString());
Object action = DConStruc.newInstance(args);
actionUrl.set(action,url);
actionText.set(action,text);
withContext.invoke(action,new Object[]{});
}
catch (Exception e) {
e.printStackTrace();
}
然后代码中的DimIProxy是Dim的private class。actionUrl、actionText是DimIProxy内部的参数,withContext是其一个函数,DConStruc 是其构造函数。多谢各位的关注。关于static class的问题暂时没有涉及,下次做过实验再贴出来。