浅谈Java反射机制 之 获取类的 方法 和 属性(包括构造函数)
上一篇 获取 类 的字节码文件 我们讲到了获取类的字节码文件的三种方法
第三种方法通过getClass("全路径名")获取字节码文件最符合要求
1、获取构造方法
先贴上我们要获取的类结构
import java.util.Date;
public class Student {
private String name;
private Integer age;
private Date Birthday;
public Student(){
}
private Student(String name){
this.name=name;
}
private Student(Integer age){
this.age=age;
}
private Student(Date Birthday){
this.Birthday=Birthday;
}
public Student(String name,Integer age){
this.name=name;
this.age=age;
}
public Student(Integer age,String name){
this.name=name;
this.age=age;
}
public Student(String name,Date Birthday){
this.name=name;
this.Birthday=Birthday;
}
public Student(Date Birthday,String name){
this.name=name;
this.Birthday=Birthday;
}
public Student(Integer age,Date Birthday){
this.age=age;
this.Birthday=Birthday;
}
public Student(Date Birthday,Integer age){
this.age=age;
this.Birthday=Birthday;
}
public Student(String name,Integer age,Date Birthday){
this.age=age;
this.name=name;
this.Birthday=Birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return Birthday;
}
public void setSex(Date sex) {
this.Birthday = Birthday;
}
}
通过 getConstructors() getDeclaredConstructors() getConstructor() getDeclaredConstructor()这四个方法获取各种构造方法
import java.lang.reflect.Constructor;
import java.util.Date; public class Test04 {
public static void main(String[] args) throws ClassNotFoundException,NoSuchMethodException{ //加载Class对象
//会报出不存在该类的异常
Class c=Class.forName("com.reflection.model.Student"); //获取所有公用构造方法
System.out.println("================获取所有公共的构造方法=================");
Constructor[] constructors=c.getConstructors();
for (Constructor constructor:constructors) {
System.out.println("公共的构造方法:"+constructor);
}
//获取所有构造方法
System.out.println("================获取所有的构造方法=================");
Constructor[] declaredconstructors=c.getDeclaredConstructors();
for (Constructor constructor:declaredconstructors) {
System.out.println("所有构造方法:"+constructor);
} //获取公有&无参构造方法
System.out.println("================获取公有&无参构造方法================="); //会报出没有该方法的异常
Constructor constructor1=c.getConstructor(null);
System.out.println("公有&无参构造方法:"+constructor1); //获取公有&有参构造方法
System.out.println("================获取公有&有参构造方法================="); //会报出没有该方法的异常
Constructor constructor2=c.getConstructor(new Class[]{String.class,Integer.class, Date.class});
System.out.println("公有&有参构造方法:"+constructor2);
Constructor constructor3=c.getConstructor(new Class[]{String.class,Integer.class});
System.out.println("公有&有参构造方法:"+constructor3); //获取私有&有参构造方法
System.out.println("================获取私有&有参构造方法================="); //会报出没有该方法的异常
Constructor declaredconstructor1=c.getDeclaredConstructor(new Class[]{String.class});
System.out.println("私有&有参构造方法:"+declaredconstructor1);
}
}
结果:
================获取所有公共的构造方法=================
公共的构造方法:public com.reflection.model.Student(java.lang.Integer,java.lang.String)
公共的构造方法:public com.reflection.model.Student(java.lang.String,java.util.Date)
公共的构造方法:public com.reflection.model.Student(java.util.Date,java.lang.String)
公共的构造方法:public com.reflection.model.Student(java.lang.Integer,java.util.Date)
公共的构造方法:public com.reflection.model.Student(java.util.Date,java.lang.Integer)
公共的构造方法:public com.reflection.model.Student(java.lang.String,java.lang.Integer,java.util.Date)
公共的构造方法:public com.reflection.model.Student()
公共的构造方法:public com.reflection.model.Student(java.lang.String,java.lang.Integer)
================获取所有的构造方法=================
所有构造方法:public com.reflection.model.Student(java.lang.Integer,java.lang.String)
所有构造方法:public com.reflection.model.Student(java.lang.String,java.util.Date)
所有构造方法:public com.reflection.model.Student(java.util.Date,java.lang.String)
所有构造方法:public com.reflection.model.Student(java.lang.Integer,java.util.Date)
所有构造方法:public com.reflection.model.Student(java.util.Date,java.lang.Integer)
所有构造方法:public com.reflection.model.Student(java.lang.String,java.lang.Integer,java.util.Date)
所有构造方法:public com.reflection.model.Student()
所有构造方法:private com.reflection.model.Student(java.lang.String)
所有构造方法:private com.reflection.model.Student(java.lang.Integer)
所有构造方法:private com.reflection.model.Student(java.util.Date)
所有构造方法:public com.reflection.model.Student(java.lang.String,java.lang.Integer)
================获取公有&无参构造方法=================
公有&无参构造方法:public com.reflection.model.Student()
================获取公有&有参构造方法=================
公有&有参构造方法:public com.reflection.model.Student(java.lang.String,java.lang.Integer,java.util.Date)
公有&有参构造方法:public com.reflection.model.Student(java.lang.String,java.lang.Integer)
================获取私有&有参构造方法=================
私有&有参构造方法:private com.reflection.model.Student(java.lang.String)
结论:
getConstructors()返回所有public的构造器。
getDeclaredConstructors()返回所有private和public构造器。
getConstructor()返回指定参数类型public的构造器。
getDeclaredConstructor()返回指定参数类型的private和public构造器。
2、获取类属性
将 1 中的 Student 类中的 name 字段设为 public
public String name;
通过 getFields() getDeclaredFields() getField() getDeclaredField()这四个方法获取各种字段
import java.lang.reflect.Field;
public class Test05 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException { //加载Class对象
//会报出不存在该类的异常
Class c=Class.forName("com.reflection.model.Student"); //获取所有公用公共字段
System.out.println("================获取所有公共字段=================");
Field[] fields=c.getFields();
for (Field field:fields) {
System.out.println("公共字段:"+field);
}
//获取所有字段
System.out.println("================获取所有的字段(公共的、私有的)=================");
Field[] declaredFields=c.getDeclaredFields();
for (Field declaredfield:declaredFields) {
System.out.println("所有字段:"+declaredfield);
} System.out.println("================根据字段名获取公共字段=================");
//根据字段名获取公共字段
Field field1=c.getField("name");
System.out.println("根据字段名获取公共字段:"+field1); System.out.println("================根据字段名私有字段=================");
//根据字段名获取公共字段
Field field2=c.getDeclaredField("age");
System.out.println("根据字段名获取公共字段:"+field2); }
}
结果:
================获取所有公共字段=================
公共字段:public java.lang.String com.reflection.model.Student.name
================获取所有的字段(公共的、私有的)=================
所有字段:public java.lang.String com.reflection.model.Student.name
所有字段:private java.lang.Integer com.reflection.model.Student.age
所有字段:private java.util.Date com.reflection.model.Student.Birthday
================根据字段名获取公共字段=================
根据字段名获取公共字段:public java.lang.String com.reflection.model.Student.name
================根据字段名私有字段=================
根据字段名获取公共字段:private java.lang.Integer com.reflection.model.Student.age
结论:
getFields()返回所有public的字段。
getDeclaredFields()返回所有private和public字段。
getField()返回指定字段名public的字段。
getDeclaredField()返回指定字段名的private和public字段名。
3、获取类中的方法
在 1 中的Student类中定义几个方法
public void method1(String str){
System.out.println("public 修饰的方法");
}
private void method2(){
System.out.println("private 修饰的方法");
}
String method3(String name,Integer sex,Date age){
System.out.println("默认修饰"+name+" "+sex+" "+age);
return name+" "+sex+" "+age;
}
protected void method4(){
System.out.println("protected 修饰的方法");
}
通过 getMethods() getDeclaredMethods() getMethod() getDeclaredMethod()这四个方法获取各种方法
import java.lang.reflect.Method;
import java.util.Date; public class Test06 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException { //加载Class对象
//会报出不存在该类的异常
Class c=Class.forName("com.reflection.model.Student"); //获取所有公共方法
System.out.println("================获取所有公共方法=================");
Method[] methods=c.getMethods();
for (Method method:methods) {
System.out.println("公共方法:"+method);
}
//获取所有方法
System.out.println("================获取所有的方法=================");
Method[] declaredMethods=c.getDeclaredMethods();
for (Method declaredmethod:declaredMethods) {
System.out.println("所有方法:"+declaredmethod);
} System.out.println("================获取特定(带参)方法=================");
Method method1=c.getMethod("method1",String.class);
System.out.println("特定(带参)方法:"+method1); System.out.println("================获取特定(不带参)方法=================");
Method method2=c.getDeclaredMethod("method2");
System.out.println("特定(不带参)方法:"+method2); System.out.println("================获取特定(多参)方法=================");
Method method3=c.getDeclaredMethod("method3", String.class, Integer.class, Date.class);
System.out.println("特定(多参)方法:"+method3);
}
}
结果:
================获取所有公共方法=================
公共方法:public java.lang.String com.reflection.model.Student.getName()
公共方法:public void com.reflection.model.Student.setName(java.lang.String)
公共方法:public void com.reflection.model.Student.method1(java.lang.String)
公共方法:public void com.reflection.model.Student.setSex(java.util.Date)
公共方法:public java.util.Date com.reflection.model.Student.getBirthday()
公共方法:public java.lang.Integer com.reflection.model.Student.getAge()
公共方法:public void com.reflection.model.Student.setAge(java.lang.Integer)
公共方法:public final void java.lang.Object.wait() throws java.lang.InterruptedException
公共方法:public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
公共方法:public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
公共方法:public boolean java.lang.Object.equals(java.lang.Object)
公共方法:public java.lang.String java.lang.Object.toString()
公共方法:public native int java.lang.Object.hashCode()
公共方法:public final native java.lang.Class java.lang.Object.getClass()
公共方法:public final native void java.lang.Object.notify()
公共方法:public final native void java.lang.Object.notifyAll()
================获取所有的方法=================
所有方法:public java.lang.String com.reflection.model.Student.getName()
所有方法:public void com.reflection.model.Student.setName(java.lang.String)
所有方法:private void com.reflection.model.Student.method2()
所有方法:public void com.reflection.model.Student.method1(java.lang.String)
所有方法:java.lang.String com.reflection.model.Student.method3(java.lang.String,java.lang.Integer,java.util.Date)
所有方法:public void com.reflection.model.Student.setSex(java.util.Date)
所有方法:public java.util.Date com.reflection.model.Student.getBirthday()
所有方法:protected void com.reflection.model.Student.method4()
所有方法:public java.lang.Integer com.reflection.model.Student.getAge()
所有方法:public void com.reflection.model.Student.setAge(java.lang.Integer)
================获取特定(带参)方法=================
特定(带参)方法:public void com.reflection.model.Student.method1(java.lang.String)
================获取特定(不带参)方法=================
特定(不带参)方法:private void com.reflection.model.Student.method2()
================获取特定(多参)方法=================
特定(多参)方法:java.lang.String com.reflection.model.Student.method3(java.lang.String,java.lang.Integer,java.util.Date)
结论:
getMethods()返回所有public的方法,通过结果可以看出getMethods()连父类中的。public方法也可以获取到
getDeclaredMethods()返回所有private和public方法名,。getDeclaredMethods()获取不到父类中的方法,只能获取到本来中的方法
get返回指定字段名Method()public的方法名。
getDeclared返回指定字方法名的Method()private和public字段名。
注:
由getMethods()和getDeclaredMethods()方法我们推测获取字段的方法和获取构造函数的方法
应该和getMethods()和getDeclaredMethods()一样,
为了验证,又定义了一个People类,getFields()和getDeclaredFields()
public class People {
public String head;
public String foot;
}
Student继承People
================获取所有公共字段=================
公共字段:public java.lang.String com.reflection.model.Student.name
公共字段:public java.lang.String com.reflection.model.People.head
公共字段:public java.lang.String com.reflection.model.People.foot
================获取所有的字段(公共的、私有的)=================
所有字段:public java.lang.String com.reflection.model.Student.name
所有字段:private java.lang.Integer com.reflection.model.Student.age
所有字段:private java.util.Date com.reflection.model.Student.Birthday
getFields()可以获取到父类的所有公共的字段,getDeclaredFields()只能获取到本类中的字段
================获取所有公共的构造方法=================
公共的构造方法:public com.reflection.model.Student(java.lang.String,java.lang.String)
================获取所有的构造方法=================
所有构造方法:public com.reflection.model.Student(java.lang.String,java.lang.String)
上面的结果也证明了
获取到父类的构造方法,getConstructors()不能getDeclaredConstructors()也只能获取到本类中的构造方法
浅谈Java反射机制 之 获取类的 方法 和 属性(包括构造函数)的更多相关文章
- 浅谈Java反射机制 之 获取类的字节码文件 Class.forName("全路径名") 、getClass()、class
另一个篇:获取 类 的 方法 和 属性(包括构造函数) 先贴上Java反射机制的概念: AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它 ...
- Java反射机制 之 获取类的 方法 和 属性(包括构造函数)(Day_06)
把自己立成帆,才能招来凤. 运行环境 JDK8 + IntelliJ IDEA 2018.3 本文中使用的jar包链接 https://files.cnblogs.com/files/papercy ...
- 浅谈Java反射机制 之 使用类的 属性、方法和构造函数
前面两篇我们总结了Java反射机制如何获取类的字节码,如何获取构造函数,属性和方法, 这篇我们将进一步验证如何使用我们获取到的属性.方法以及构造函数 1.使用 反射 获取到的 属性 import ja ...
- 浅谈java反射机制
目录 什么是反射 初探 初始化 类 构造函数 属性 方法 总结 思考 什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意 ...
- 浅谈 java 反射机制
一:Java反射概念 Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其mod ...
- JAVA反射机制教程-获取类对象
1. 什么是类对象 类对象,就是用于描述这种类,都有什么属性,什么方法的 2. 获取类对象 获取类对象有3种方式(1). Class.forName(2). Hero.class(3). new He ...
- Java反射机制涉及的类常见方法使用总结
import java.lang.reflect.Constructor; import java.lang.reflect.*; /*Class:代表一个字节码文件的对象,每当有类被加载进内存,JV ...
- Java -- 浅入Java反射机制
1,Java 反射是Java语言的一个很重要的特征,它使得Java具体了"动态性". Java 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类. 在运行时构造任意一 ...
- java 通过反射机制调用某个类的方法
package net.xsoftlab.baike; import java.lang.reflect.Method; public class TestReflect { public s ...
随机推荐
- egon消失的一天,空虚寂寞冷,苑模块的时间
一.时间模块time python有三种表达时间的形式:时间戳.格式化字符串输出和元组. 时间戳:从1970年1月1日00:00:00开始按秒计算的偏移量,返回值是一个float型. 格式化字符串输出 ...
- STM32 GPIO相关
1. STM32 的 IO 作为输入的时候,可以程序设置上下拉电阻(可以不用外接上下拉电阻). 2.GPIO有四种输入模式:浮空输入.上拉输入.下拉输入.模拟输入: 3.GPIO有四种输出模式:开漏输 ...
- LNMP小项目搭建,Centos7.6环境搭建Linux+nginx+mysql+php,wordpress个人博客的搭建(完整搭建步骤)
一.LNMP搭建,基于nginx服务器搭建wordpress个人博客 准备环境:centos7.6环境下web服务器(nginx+php):主机名:web01,ip:192.168.248.172my ...
- PAT Advanced 1002 A+B for Polynomials (25 分)(隐藏条件,多项式的系数不能为0)
This time, you are supposed to find A+B where A and B are two polynomials. Input Specification: Each ...
- ubuntu下安装python3.6.5导入ssl模块失败
1.问题 python安装完毕后,提示找不到ssl模块: [root@localhost ~]# python3 Python ( , ::) [GCC (Red Hat -)] on linux2 ...
- python的java胶水(jpype1)
1.直接使用pip安装jpype1 命令 pip install jpype1 但是,很不幸,提示报错,缺少VC++组件. 2.使用其他方法安装 在 https://www.lfd.uci.edu/ ...
- 06java进阶——集合框架(list和泛型)
1.ArrayList ArrayList集合是程序中最常见的一种集合,它属于引用数据类型(类).在ArrayList内部封装了一个长度可变的数组,当存入的元素超过数组长度时,ArrayList会在内 ...
- 长沙理工大学第十二届ACM大赛-重现赛 B 日历中的数字 (实现)
链接:https://ac.nowcoder.com/acm/contest/1/B来源:牛客网 全屏查看题目 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他 ...
- python3-多重继承
继承是面向对象编程的一个重要的方式,因为通过继承,子类就可以扩展父类的功能. 回忆一下Animal类层次的设计,假设我们要实现以下4种动物: Dog - 狗狗: Bat - 蝙蝠: Parrot - ...
- mysql的索引以及优化
本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群: 281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29Lo ...