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.成员变量 ...
随机推荐
- MySQL Group By 实例讲解(二)
mysql group by使用方法实例讲解 MySQL中GROUP BY语句用于对某个或某些字段查询分组,并返回这个字段重复记录的第一条,也就是每个小组(无排序)里面的第一条. 本文章通过实例向大家 ...
- IDEA2019.2中文字体变粗缺字等问题
idea的中文字体渲染问题 IDEA 2018.2升级到 IDEA 2019.2,中文字体渲染问题修改一下备用字体就可以共需要修改两处:1.Setting -> Editor -> Fon ...
- [E2E_L9]类化和级联化
一.多车辆识别可能和车辆车牌分割: 这样一张图,可以识别多车辆和车牌,问题是如何区分并且配对. 0 1 7 8 是否是车牌可以通过图片的大小进行判断.而配对是前后顺序的. // ------- ...
- C#中的断言(Assert)
重构-断言 现象:某一段代码需要对程序状态做出某种假设 做法:以断言明确表现这种假设 动机: 常常有这种一段代码:只有某个条件为真是,该改名才能正常运行. 通常假设这样的假设并没有代码中明确表现出来, ...
- 30段极简Python代码
Python 是机器学习最广泛采用的编程语言,它最重要的优势在于编程的易用性.如果读者对基本的 Python 语法已经有一些了解,那么这篇文章可能会给你一些启发.作者简单概览了 30 段代码,它们都是 ...
- [译]如何根据Pandas中的列名获取列所在的index位置?
原文来源:https://stackoverflow.com/questions/13021654/get-column-index-from-column-name-in-python-pandas ...
- Java通过行为参数化传递代码
在软件工程中,一个众所周知的问题就是,不管做什么,用户的需求肯定会变.如何应对这样不断变化的需求?理想的状态下,应该把的工作量降到最少.此外,类似的新功能实现起来还应该很简单,而且易于长期维护.行为参 ...
- LinQ中合并、连接、相交、与非查询
LinQ中Union合并查询:连接不同的集合,自动过滤相同项:延迟.即是将两个集合进行合并操作,过滤相同的项 var cities = (from p in mylinq.System_Places ...
- [LeetCode] 81. Search in Rotated Sorted Array II 在旋转有序数组中搜索 II
Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...
- mysql执行计划详解,
一.语法 explain SQL语句 例如: explain ; 二.explain输出解释 +----+-------------+-------+-------+----------------- ...