<>Class里的方法

<>1. getClasses 和 getDeclaredClasses

* getDeclaredClasses 获取到类里所有的的class ,interface 包括了private
,protected,default,public
例子:
定义一个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
* getClasses 只获取到public
上面的测试代码改成 Class[] cls=Payment.class.getClasses(); for (int i = 0; i
<cls.length ; i++) { System.out.println(cls[i]); }
只获取到
class rechard.learn.reflect.Payment$InnerAccount
<>2. getConstructors 和 getDeclaredConstructors

* getDeclaredConstructors 打印出类的所有的构造函数 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{ } }
* getConstructors 打印出类的public构造函数
<>3. new instance

如何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(); } } }

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信