Class对象、反射机制、获取Constructor构造方法
1、Class对象的三种创建方法(Class首字母大写)
public class Demo {
public static void main(String[] args){
Object obj=new Object();//方法一:先new对象,再调用方法,创建Class对象c1
Class c1=obj.getClass();
Class c2=Object.class;//方法二:使用.class属性,无需new对象,直接创建Class对象c2
try {
//方法三(推荐):调用Class类的forName方法,不需考虑类是否存在,功能强大。
Class c3=Class.forName("java.lang.Object");
System.out.println("c3哈希值:"+c3.hashCode());//哈希值判断是否指向同一对象
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println("c1哈希值:"+c1.hashCode());
System.out.println("c2哈希值:"+c2.hashCode());
}
}
Class对象的价值:反射机制。
Class对象可以看作某个类的影子,通过影子,可以获得这个类的方法、属性等。
如下案例中,Demo.java中的Class对象c是Example.java的影子。通过c,获得Examp中的方法类型、参数类型等。
2、获得Constructor构造方法(java.lang.reflect.Constructor包下)
class.getConstructors() 获取所有公有public构造方法。()内带参数,则获取指定的public构造方法。
class.getDeclaredConstructors() 获取所有构造方法。()内带参数,则获取指定构造方法。
构造方法Constructor的一些属性:getModifiers修饰符、getName名字、getParameterTypes参数类型
public class Demo {
public static void main(String[] args) {
try {
Class c = Class.forName("Example");//创建类对象。同一包下,直接使用
Constructor cons[] = c.getDeclaredConstructors();//获取Example中的所有构造方法
for (Constructor con : cons) {//con.getModifiers()返回Int型,所以转字符串
System.out.print(Modifier.toString(con.getModifiers()) + " ");//获取修饰符
System.out.println(con.getName());//方法名
Class paras[] = con.getParameterTypes();//方法中的参数类型
for (int i = 0; i < paras.length; i++) {
System.out.println(paras[i].getSimpleName());//参数类型的简化名
}
}
//无参数的构造方法。Example中toString
Constructor cs1 = c.getDeclaredConstructor();//Example中无参数的构造方法
Object obj = cs1.newInstance();//实例化
System.out.println(obj.toString());//调用Example中toString方法
//1个参数的构造方法。Example中id赋值123
Constructor cs2 = c.getDeclaredConstructor(int.class);//Example中int型参数的构造方法
obj = cs2.newInstance(123);//实例化
System.out.println(obj.toString());//调用Example中toString方法
//3个参数的构造方法。Example中id、name、price赋值
Constructor cs3 = c.getDeclaredConstructor(int.class, String.class, double.class);//Example中3参数的构造方法
cs3.setAccessible(true);//private私有方法无法使用,故获取权限
obj = cs3.newInstance(123, "反射", 3.14);//实例化
System.out.println(obj.toString());//调用Example中toString方法
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
public class Example {
int id;
String name;
double price; //Alt+Insert,Constructor快速创建构造方法
public Example() {
} public Example(int id) {
this.id = id;
} private Example(int id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
} //Alt+Insert,toString快速创建构造方法
public String toString() {//返回Example的值
return "Example{" +
"id=" + id +
", name='" + name + '\'' +
", price=" + price +
'}';
}
}
Class对象、反射机制、获取Constructor构造方法的更多相关文章
- Day16_89_通过反射机制获取所有构造方法
通过反射机制获取某个特定的构造方法 * 代码 import java.lang.reflect.Constructor; import java.lang.reflect.Modifier; publ ...
- Day16_90_通过反射机制获取某个特定的构造方法
通过反射机制获取某个特定的构造方法 public class ReflectTest13 { public static void main(String[] args) throws ClassNo ...
- java反射机制获取自定义注解值和方法
由于工作需求要应用到java反射机制,就做了一下功能demo想到这些就做了一下记录 这个demo目的是实现动态获取到定时器的方法好注解名称,废话不多说了直接上源码 1.首先需要自定义注解类 /** * ...
- java 中利用反射机制获取和设置实体类的属性值
摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...
- Day16_91_通过反射机制获取父类和父接口
通过反射机制获取父类和父接口 * 代码: import java.net.InterfaceAddress; public class ReflectTest14 { public static vo ...
- Day15_87_通过反射机制获取某个特定的方法
通过反射机制获取某个特定的方法 反射是通过 方法名+形参列表来区分各个方法的(形参列表要用class类型.加.class) 示例代码 import java.lang.reflect.Method; ...
- Day15_86_通过反射机制获取所有方法(method)
通过反射机制获取所有方法(method) import java.lang.reflect.Field; import java.lang.reflect.Method; import java.la ...
- Day14_83_反射机制获取某个特定属性的各部分
反射机制获取某个特定属性的各部分 * 通过属性名(变量名)来获取一个属性整体 例如: Field userNoField=c.getDeclaredField("userNo"); ...
- Day14_81_反射机制获取Class属性
反射机制获取Class属性 获取属性 方法一: Class对象 . getFields();只能用来获取公开的属性,不能获取有私有的或者受保护的属性 获取属性 方法二: Class对象 . getDe ...
- kettle job如何利用java的反射机制获取执行的sql语句
kettle job中的JavaScript如何获取同一个job中SQL步骤的执行语句并让执行语句记录在日志中呢?首先写日志需要用到job中JavaScript写日志的方法,其次是利用java反射机制 ...
随机推荐
- mysql执行 sql文件遇到USING BTREE ) ENGINE=MyISAM DEFAULT CHARSET=utf8错误
使用navcat在导入别人发的mysql数据的时候,报了下面这个错误: [Err] 1064 - You have an error in your SQL syntax; check the man ...
- pandas修改全列的时间格式 无需使用apply
df.date.dt.strftime('%Y%m%d') #实现全列修改时间格式
- 初识nginx——内存池篇
初识nginx——内存池篇 为了自身使用的方便,Nginx封装了很多有用的数据结构,比如ngx_str_t ,ngx_array_t, ngx_pool_t 等等,对于内存池,nginx设计的十分精炼 ...
- MySQL基础~~编程语法
常量 数值 字符串:单引号或者双引号括起来.包括普通字符串或者日期格式的字符串. 布尔值:false(FALSE)对应数字值为0.true(TRUE)对应数字值为1. NULL:可以参考http:// ...
- eclipse集成tomcat日志文件输出配置
eclipse集成tomcat日志文件输入配置 2015-07-21 00:13 1072人阅读 评论(0) 收藏 举报 分类: tomcat(1) eclipse Where can I vie ...
- Linux:cut命令详解
cut 文件内容查看 显示行中的指定部分,删除文件中指定字段 显示文件的内容,类似于下的type命令. 说明 该命令有两项功能,其一是用来显示文件的内容,它依次读取由参数file所指明的文件,将它们的 ...
- Linux 更改root与home分区大小的方法总结
1. 安装了CentOS7.5的虚拟机 但是发现里面的操作系统 home 分区占到了400g 根分区只有50g 认为不太好,所以要改一下. 2.方法. 好像是xfs的文件格式, 没法使用resize2 ...
- [转帖]DevOps/TestOps概念
发现收藏不好用..还是转吧.. https://www.cnblogs.com/fnng/p/8232410.html DevOps/TestOps概念 2018-01-07 22:02 by 虫师, ...
- 自动化运维python学习笔记一
Python简介 python是吉多·范罗苏姆发明的一种面向对象的脚本语言,可能有些人不知道面向对象和脚本具体是什么意思,但是对于一个初学者来说,现在并不需要明白.大家都知道,当下全栈工程师的概念很火 ...
- WINFORM 多条件动态查询 通用代码的设计与实现
经常碰到多条件联合查询的问题,以前的习惯认为很简单总会从头开始设计布局代码,往往一个查询面要费上老半天的功夫,而效果也不咋地. 前段时间做了个相对通用的多条件动态查询面,复用起来还是挺方便的, ...