赞
踩
例子:
定义一个Payment的基本类如下
public class Payment {
protected class InnerPayment{
}
String name;
interface Account{}
public class InnerAccount implements Payment.Account{
}
private class InnerAccount2 implements Payment.Account{
}
}
测试
public class PaymentReflectTest {
public static void main(String[] args) {
Class[] cls=Payment.class.getDeclaredClasses();//获取到所有的定义的class
for (int i = 0; i <cls.length ; i++) {
System.out.println(cls[i]);
}
}
}
打印出来的结果如下
class rechard.learn.reflect.Payment$InnerAccount2
class rechard.learn.reflect.Payment$InnerAccount
interface rechard.learn.reflect.Payment$Account
class rechard.learn.reflect.Payment$InnerPayment
Class[] cls=Payment.class.getClasses();
for (int i = 0; i <cls.length ; i++) {
System.out.println(cls[i]);
}
只获取到
class rechard.learn.reflect.Payment$InnerAccount
Class[] cls=Payment.class.getDeclaredClasses();
for (int i = 0; i <cls.length ; i++) {
Constructor[] cs= cls[i].getDeclaredConstructors();
for (int j = 0; j <cs.length; j++) {
System.out.println(cs[j]);
}
}
打印的结果如下
private rechard.learn.reflect.Payment$InnerAccount2(rechard.learn.reflect.Payment)
public rechard.learn.reflect.Payment$InnerAccount(rechard.learn.reflect.Payment)
protected rechard.learn.reflect.Payment$InnerPayment(rechard.learn.reflect.Payment)
由于这里的class都是内部类,第一个参数是父类。new 的时候使用
new Payment().new InnerAccount();
如果定义的内部类是static ,则new 的时候使用
new Payment.InnerStaticAccount()
public class Payment {
public static class InnerStaticAccount implements Payment.Account{
}
}
如何new Payment里的InnerAccount
public class Payment { protected class InnerAccount implements Payment.Account{ private String acctNumber; public InnerAccount(String acctNumber){ this.acctNumber=acctNumber; } public String getAcctNumber() { return acctNumber; } @Override public String toString() { return "InnerAccount{" + "acctNumber='" + acctNumber + '\'' + '}'; } } }
如果 new InnerAccount 的类不和Payment 在同一个package下,写成如下,会报错,InnerAccount为proctected 不可见:
new Payment().new InnerAccount("111111");
改成以下代码调用
Class[] cls = Payment.class.getDeclaredClasses();
for (int i = 0; i < cls.length; i++) {
if(cls[i].getSimpleName().equals("InnerAccount")){
try {
Constructor c=(Constructor)cls[i].getDeclaredConstructor(Payment.class,String.class);
c.setAccessible(true);
System.out.println(c.newInstance(new Payment(),"123"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
其实这样构造出来的有诸多不变,上面的c.newInstance(new Payment(),"123")
,没法用一个实际的引用的引用,只能用Object o 来引用,如果如果要调用getAcctNumber()
,只能通过反射来调用,如下:
Class[] cls = Payment.class.getDeclaredClasses();
for (int i = 0; i < cls.length; i++) {
if(cls[i].getSimpleName().equals("InnerAccount")){
try {
Constructor c=(Constructor)cls[i].getDeclaredConstructor(Payment.class,String.class);
c.setAccessible(true);
Object o=c.newInstance(new Payment(),"123");
Method m=o.getClass().getMethod("getAcctNumber",null);
System.out.println(m.invoke(o,null));
}catch (Exception e) {
e.printStackTrace();
}
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。