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.成员变量 ...
随机推荐
- SpringBoot使用jasypt加解密密码
在我们的服务中不可避免的需要使用到一些秘钥(数据库.redis等) 开发和测试环境还好,但生产如果采用明文配置讲会有安全问题,jasypt是一个通用的加解密库,我们可以使用它. <depende ...
- LeetCode_447. Number of Boomerangs
447. Number of Boomerangs Easy Given n points in the plane that are all pairwise distinct, a "b ...
- IDEA中MyBatis插件的安装及使用
这个插件的好处就在于能自动关联mapper类与xml,让你可以快速的互相跳转,还能帮助你做简单的排错. 安装方法: 1.File→Settings→Plugins,输入mybatis plugin,本 ...
- 使用C++调用并部署pytorch模型
1.背景(Background) 上图显示了目前深度学习模型在生产环境中的方法,本文仅探讨如何部署pytorch模型! 至于为什么要用C++调用pytorch模型,其目的在于:使用C++及多线程可以加 ...
- LODOP打印超文本有边距不居中的情况2
之前的博文:LODOP打印项水平居中.之前的博文有介绍超文本和纯文本的居中方式,设置超文本打印项居中时,注意打印内容要在打印项本身宽度里居中.之前的博文超文本用的是个表格,而且表格本身没有margin ...
- HLSL Shader编程基础总结
转自:https://blog.csdn.net/Blues1021/article/details/47093487 基本前提概念 Shader是一种映射到GPU硬件汇编语言上的高级语言,Shade ...
- Layer文件上传同时传递表单数据
(1)index.html <!DOCTYPE html> <html> <head> <title>TODO supply a title</t ...
- Linux服务器安装rocketMQ单机消息队列
首先下载rocketMQ 1.解压: > unzip rocketmq-all-4.3.0-source-release.zip > cd rocketmq-all-4.3.0/ > ...
- OpenJudge 4152 最佳加法表达式
总时间限制: 1000ms 内存限制: 65536kB 描述 给定n个1到9的数字,要求在数字之间摆放m个加号(加号两边必须有数字),使得所得到的加法表达式的值最小,并输出该值.例如,在1234中摆放 ...
- jira中使用eazyBI
参考:https://docs.eazybi.com/eazybijira/set-up-and-administer/set-up-and-administer-for-jira-server/in ...