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();
}
Java关于 class类的基础方法的更多相关文章
- java.lang.String 类的所有方法
java.lang.String 类的所有方法 方法摘要 char charAt(int index) 返回指定索引处的 char 值. int codePointAt(int index) 返回指定 ...
- java的ThreadLocal类的使用方法
java的ThreadLocal类的使用方法,ThreadLocal是一个支持泛型的类,用在多线程中用于防止并发冲突问题. 比如以下的一个样例,就是用于线程添加1,可是相互不冲突 package co ...
- Java中主类中定义方法加static和不加static的区别
Java中主类中定义方法加static和不加static的区别(前者可以省略类名直接在主方法调用(类名.方法),后者必须先实例化后用实例调用) 知识点:1.Getter and Setter 的应用 ...
- Java中Pattern类的quote方法将任何字符串(包括正则表达式)都转换成字符串常量,不具有任何匹配功能
Java中Pattern类的quote方法将任何字符串(包括正则表达式)都转换成字符串常量,不具有任何匹配功能. 下面是个例子: import org.junit.Test; import java. ...
- java 之 file类的一些方法
File类: File类是java.io包下代表与平台无关的文件和目录,也就是说,如果希望在程序中操作文件和目录,都可以通过File类来完成.但是File不能访问文件内容本身. 访问文件和目录: 1. ...
- Java中String类的format方法使用总结
可参考: http://www.cnblogs.com/fsjohnhuang/p/4094777.html http://kgd1120.iteye.com/blog/1293633 String类 ...
- JAVA不让类实例化的方法
虽然java是面向对象编程,但也要尽可能避免创建不必要的对象,因为创建过多的对象不仅占用系统资源,而且多了很多不必要的创建销毁对象开销. 那么有哪些避免类创建对象的方法吗? 1,定义私有构造函数.这在 ...
- 关于JAVA的String类的一些方法
一.得到字符串对象的有关信息 1.通过调用length()方法得到String的长度. String str=”This is a String”; int len =str.length(); 2. ...
- Java基础(42):Java中主类中定义方法加static和不加static的区别(前者可以省略类名直接在主方法调用,后者必须先实例化后用实例调用)
package lsg.ap.april4th2; /* 知识点:1.Getter and Setter 的应用 2.局部变量与成员变量(也可叫做全局变量) 3.Static关键字的用法 a.成员变量 ...
随机推荐
- MySQL8新特性(2)--mysql的升级过程
在之前的版本中,安装新的版本mysql之后,mysql server在下一次启动时,会自动升级数据字典表,然后dba需要执行mysql_upgrade手动升级mysql schema中的系统表,以及其 ...
- python实现读取并显示图片的两种方法
https://www.cnblogs.com/lantingg/p/9259840.html 在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片. ...
- jeff dean的主页
https://ai.google/research/people/jeff/ 上面有他的很多论文和ppt 很不错 我于1999年中期加入Google,目前是研究小组的Google高级研究员,负责Go ...
- Linux服务器连接不上的几种解决办法
Linux远程服务器连接不上,或连接超时解决办法:1.测试网络是否通: ping 远程IP 2.如果能ping通则表示与服务器网络连接是正常,接下来测试端口:telnet 远程ip 端口 3.如 ...
- Tensorflow问题
TypeError: 'urban' has type str, but expected one of: bytes 在前面添加"b"(例如,b'urban'),或者处理为var ...
- (三)用CONCAT 函数 拼接字段
一.将两个列拼接成一个列 数据源 select CONCAT(TRIM(username),'(',locaiton,')') from user2 解释: TRIM()函数用于去除字符串左右两边的空 ...
- [LeetCode] 113. Path Sum II 路径和 II
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...
- Asp.net SignalR 让实时通讯变得如此简单
巡更项目中,需要发送实时消息,以及需要任务开始提醒,于是便有机会接触到SignalR,在使用过程中,发现用SignalR实现通信非常简单,下面我思明将从三个方面分享一下: 一.SignalR是什么 A ...
- 关于ios手机上拉和下拉到底部和顶部的橡皮筋问题
之前遇到一个问题,就是写了一个正常的移动端首页,底部是导航,上面的是内容,在安卓手机是页面滑动到底部的时候,不会再滑动的,但是问题就出现在ios手机中.页面正常布局是,导航是position:fixe ...
- 【LeetCode】最长公共前缀【二分】
编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow" ...