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反射机制 ...
随机推荐
- oracle数据恢复方法
https://www.cnblogs.com/hqbhonker/p/3977200.html
- 20150401 作业2 结对 四则运算ver 1.0
Web項目下 Tomcat服務器的路徑 /WebContant/ 目錄下 SE2_2.jsp <%@ page language="java" contentType=&qu ...
- 【SE】Week3 : 四则运算式生成评分工具Extension&Release Version(附加题)
[附加题]第四阶段目标 - 界面模块,测试模块和核心模块的松耦合. 写到这里我只想吐槽一句,哪天我能写出功能复杂且真正松耦合的模块,我应该就不用写代码了吧[手动再见.. 当然这只是强调下松耦合和代码复 ...
- Estimating the number of receiving nodes in 802.11 networks via machine learning
来源:IEEE International Conference on Communications 作者:Matteo Maria 年份:2016 摘要: 现如今很多移动设备都配有多个无线接口,比如 ...
- shell脚本--显示文本内容
shell脚本显示文本内容及相关的常用命令有cat.more.less.head.tail.nl 首先是cat,cat最常用的就是一次性显示文件的所有内容,如果一个文件的内容很多的话,那么就不是很方便 ...
- SQLSERVER 2014 内存优化表相关
更新了SP2的补丁能够解决 不能收缩日志文件的bug了. 但是因为已经不用内存优化表了, 所以想着能够删除内存优化表的file group 但是发现 很难删除 先说结论: 以下是针对内存优化文件组的 ...
- JavaScript高级程序设计 第六章 面向对象程序设计
面向对象程序设计 ECMA-262将对象定义为:“无序属性的集合,其属性可以包含基本值.对象或者函数.”严格来讲,这就相当于说对象是一组没有特定顺序的值.对象的每个属性和方法都有一个名字,而每个名字都 ...
- awk、sed、grep三大shell文本处理工具之sed的应用
sed 流编辑器 对文本中的行,逐行处理 非交互式的编辑器 是一个编辑器 1.工作流程 1)将文件的第一行读入到自己的缓存空间(模式空间--pattern space),删除掉换行符 2)匹配,看一下 ...
- jmeter属性与变量
jmeter属性定义在jmeter.properties 文件中 更多详细说明: Getting Started - Configuring JMeter 属性是全局的,常用来定义一些jmeter使用 ...
- [IOI2018]会议——分治+线段树
题目链接: [IOI2018]meetings 题目大意:有$n$座山峰,每座山峰有一个高度,有$q$次询问,每次需要确定一个开会山峰使$[l,r]$所有山峰上的人都前往开会山峰,一个山峰的人去开会的 ...