就是将一个匿名的类的实例做为参数传递到另一个类方法中,
这样如果两个类不再同一个包下面,就会出现IllegalAccessException,
说部清,还是先看下面三个示例吧!,在下面三个类中,代码一的类TestReflect 和代码三的类Testtt 是一样的,只是所在的包不同,代码二的类Rft 和代码一的类TestReflect 同包,类TestReflect 的main方法可以顺利执行完成,但类Testtt 则出现IllegalAccessException异常,
如果将类TestReflect 中的匿名类的getName方法,改为protected访问权限则NoSuchMethodException
现在的问题是:1、我如何只修改匿名类使得类Testtt 的main方法可以顺利执行,
2、匿名类的方法的访问权限public好像变成了protected,而其他的都变成了private,这个是什么原因?
代码一类TestReflect (这个类能正常执行)package com.test;public class TestReflect {
public TestReflect() {
} public String getA(){
Rft rft = new Rft();
return rft.getPama(new Object(){String name = "dddd";
public String getName(){return name;}},
"name").toString();
} public static void main(String[] args){
TestReflect test = new TestReflect();
System.out.print(test.getA());
}
}
代码二package com.test;import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;public class Rft {
public Rft() {
} public Object getPama(Object o,String field){
Object r = null;
Class c = o.getClass();
Field[] fs = c.getFields();
Method[] ms = c.getMethods();
Method m;
try {
m = c.getMethod("getName");
r = m.invoke(o,null);
} catch (NoSuchMethodException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (InvocationTargetException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (IllegalAccessException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
return r;
}
}代码三Testtt (这个代码会抛出异常IllegalAccessException)package com.test2;import com.test.Rft;public class Testtt {
public String getA(){
Rft rft = new Rft();
return rft.getPama(new Object(){String name = "dddd";
public String getName(){return name;}},
"name").toString();
} public static void main(String[] args){
Testtt test = new Testtt();
System.out.print(test.getA());
}
}
这样如果两个类不再同一个包下面,就会出现IllegalAccessException,
说部清,还是先看下面三个示例吧!,在下面三个类中,代码一的类TestReflect 和代码三的类Testtt 是一样的,只是所在的包不同,代码二的类Rft 和代码一的类TestReflect 同包,类TestReflect 的main方法可以顺利执行完成,但类Testtt 则出现IllegalAccessException异常,
如果将类TestReflect 中的匿名类的getName方法,改为protected访问权限则NoSuchMethodException
现在的问题是:1、我如何只修改匿名类使得类Testtt 的main方法可以顺利执行,
2、匿名类的方法的访问权限public好像变成了protected,而其他的都变成了private,这个是什么原因?
代码一类TestReflect (这个类能正常执行)package com.test;public class TestReflect {
public TestReflect() {
} public String getA(){
Rft rft = new Rft();
return rft.getPama(new Object(){String name = "dddd";
public String getName(){return name;}},
"name").toString();
} public static void main(String[] args){
TestReflect test = new TestReflect();
System.out.print(test.getA());
}
}
代码二package com.test;import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;public class Rft {
public Rft() {
} public Object getPama(Object o,String field){
Object r = null;
Class c = o.getClass();
Field[] fs = c.getFields();
Method[] ms = c.getMethods();
Method m;
try {
m = c.getMethod("getName");
r = m.invoke(o,null);
} catch (NoSuchMethodException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (InvocationTargetException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (IllegalAccessException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
return r;
}
}代码三Testtt (这个代码会抛出异常IllegalAccessException)package com.test2;import com.test.Rft;public class Testtt {
public String getA(){
Rft rft = new Rft();
return rft.getPama(new Object(){String name = "dddd";
public String getName(){return name;}},
"name").toString();
} public static void main(String[] args){
Testtt test = new Testtt();
System.out.print(test.getA());
}
}
{
public String getA()
{
Rft rft = new Rft();
return rft.getPama(new TestInner(), "name").toString();
}
public static void main(String[] args)
{
Testtt test = new Testtt();
System.out.print(test.getA());
}
public class TestInner
{
String name = "dddd";
public String getName()
{
return name;
}
}
}