Java关于 class类的基础方法
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
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
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
Constructor[] cs= cls[i].getDeclaredConstructors();
for (int j = 0; 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 {無錫看男科醫院哪家好 https://yyk.familydoctor.com.cn/20612/
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();
}
轉載于:https://www.cnblogs.com/djw12333/p/11124643.html
總結
以上是生活随笔為你收集整理的Java关于 class类的基础方法的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 【UOJ 276】无向图最小环
- 下一篇: .NET CORE编写控制台程序应有的优
