浅谈Java反射机制 之 使用类的 属性、方法和构造函数

时间:2022-02-09 09:24:08

前面两篇我们总结了Java反射机制如何获取类的字节码,如何获取构造函数,属性和方法,

这篇我们将进一步验证如何使用我们获取到的属性、方法以及构造函数

1、使用 反射 获取到的 属性

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date; public class Test08 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { //加载Class对象
//会报出不存在该类的异常
Class c=Class.forName("com.reflection.model.Student");
//类名
System.out.println("类名:"+c.getSimpleName());
//类的包名
System.out.println("类的包名:"+c.getPackage()); System.out.println("================使用获取到的字段=================");
//根据字段名获取字段
Object object= c.getConstructor().newInstance(); //获取公共字段
Field field1=c.getField("name");
//设置字段值
field1.set(object,"Not_Copy");
System.out.println("-----------------"+field1.getName()+"-------------");
System.out.println("name字段的值:"+field1.get(object));
System.out.println("name字段类型:"+field1.getType());
System.out.println("name字段修饰符:"+field1.getModifiers()); //私有字段
Field field2=c.getDeclaredField("loginName");
//开启 private 权限的方问权限
field2.setAccessible(true);
//设置字段值
field2.set(object,"Login_Not_Copy");
System.out.println("-----------------"+field2.getName()+"-------------");
System.out.println("loginName字段的值:"+field2.get(object));
System.out.println("loginName字段类型:"+field2.getType());
System.out.println("loginName字段修饰符:"+field2.getModifiers()); //私有字段
Field field3=c.getDeclaredField("age");
//开启 protected 权限的方问权限
field3.setAccessible(true);
//设置字段值
field3.set(object,23);
System.out.println("-----------------"+field3.getName()+"-------------");
System.out.println("age字段的值:"+field3.get(object));
System.out.println("age字段类型:"+field3.getType());
System.out.println("age字段修饰符:"+field3.getModifiers()); Field field4=c.getDeclaredField("Birthday");//私有字段
//开启 默认 权限的方问权限
field4.setAccessible(true);
//设置字段值
field4.set(object,new Date());
System.out.println("-----------------"+field4.getName()+"-------------");
System.out.println("Birthday字段的值:"+field4.get(object));
System.out.println("Birthday字段类型:"+field4.getType());
System.out.println("Birthday字段修饰符:"+field4.getModifiers());
}
}

结果:

类名:Student
类的包名:package com.reflection.model
================使用获取到的字段=================
-----------------name-------------
name字段的值:Not_Copy
name字段类型:class java.lang.String
name字段修饰符:1
-----------------loginName-------------
loginName字段的值:Login_Not_Copy
loginName字段类型:class java.lang.String
loginName字段修饰符:2
-----------------age-------------
age字段的值:23
age字段类型:class java.lang.Integer
age字段修饰符:4
-----------------Birthday-------------
Birthday字段的值:Mon Jul 22 21:28:02 CST 2019
Birthday字段类型:class java.util.Date
Birthday字段修饰符:0

结论:由代码 反射获取到的属性的  private、private 和 默认权限 都需要使用 暴力反射 ( .setAccessible(true) )来开启范围权限,才能访问。

2、使用 反射 获取到的 方法

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date; public class Test08 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { //加载Class对象
//会报出不存在该类的异常
Class c=Class.forName("com.reflection.model.Student"); System.out.println("================使用获取到的方法================="); Method method1=c.getMethod("method1", String.class);
//执行方法
Object invoke1 =method1.invoke(object,"method1");
System.out.println("-----------------"+method1.getName()+"-------------");
System.out.println("method1方法的返回参数列表:"+method1.getParameterTypes());
System.out.println("method1字段修饰符:"+method1.getModifiers());
System.out.println("method1字段修饰符:"+method1.getReturnType());
System.out.println("方法的返回值:"+invoke1); Method method2=c.getDeclaredMethod("method2");
//开启private权限的方问权限
method2.setAccessible(true);
//执行方法
Object invoke2 =method2.invoke(object,null);
System.out.println("-----------------"+method2.getName()+"-------------");
System.out.println("method2方法的返回参数列表:"+method2.getParameterTypes());
System.out.println("method2字段修饰符:"+method2.getModifiers());
System.out.println("method2字段修饰符:"+method2.getReturnType());
System.out.println("方法的返回值:"+invoke2); Method method3=c.getDeclaredMethod("method3", String.class, Integer.class, Date.class);
//开启默认权限的方问权限
method3.setAccessible(true);
//执行方法
Object invoke3= method3.invoke(object,"No_Copy",23,new Date());
System.out.println("-----------------"+method3.getName()+"-------------");
System.out.println("method3方法的返回参数列表:"+method3.getParameterTypes());
System.out.println("method3字段修饰符:"+method3.getModifiers());
System.out.println("method3字段修饰符:"+method3.getReturnType());
System.out.println("方法的返回值:"+invoke3); Method method4=c.getDeclaredMethod("method4");
//开启 protected 权限的方问权限
method4.setAccessible(true);
//执行方法
Object invoke4= method4.invoke(object,null);
System.out.println("-----------------"+method4.getName()+"-------------");
System.out.println("method4方法的返回参数列表:"+method4.getParameterTypes());
System.out.println("method4字段修饰符:"+method4.getModifiers());
System.out.println("method4字段修饰符:"+method4.getReturnType());
System.out.println("方法的返回值:"+invoke4); }
}

结果:

================使用获取到的方法=================
public 修饰的方法:method1
-----------------method1-------------
method1方法的返回参数列表:[Ljava.lang.Class;@14ae5a5
method1字段修饰符:1
method1字段修饰符:class java.lang.String
方法的返回值:method1
private 修饰的方法:method2
-----------------method2-------------
method2方法的返回参数列表:[Ljava.lang.Class;@7f31245a
method2字段修饰符:2
method2字段修饰符:class java.lang.String
方法的返回值:method2
protected 修饰的方法 method3
name:No_Copy age:23 birthday:Mon Jul 22 21:28:02 CST 2019
-----------------method3-------------
method3方法的返回参数列表:[Ljava.lang.Class;@6d6f6e28
method3字段修饰符:0
method3字段修饰符:class java.lang.String
方法的返回值:No_Copy 23 Mon Jul 22 21:28:02 CST 2019
protected 修饰的方法:method4
-----------------method4-------------
method4方法的返回参数列表:[Ljava.lang.Class;@135fbaa4
method4字段修饰符:4
method4字段修饰符:class java.lang.String
方法的返回值:method4

结论:由代码 反射获取到方法 的  private、private 和 默认权限 都需要使用 暴力反射 ( .setAccessible(true) )来开启范围权限,才能访问。

2、使用 反射 获取到的 构造函数

import com.reflection.model.Student;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date; public class Test08 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { //加载Class对象
//会报出不存在该类的异常
Class c=Class.forName("com.reflection.model.Student");
System.out.println(Student.class.getSuperclass().getName());
System.out.println("================使用获取到的构造方法=================");
//调用默认的构造方法
Object object1= c.getConstructor().newInstance();
//指定要调用构造方法的参数 参数:指定每个参数的类型
Constructor constructor = c.getConstructor(String.class,String.class,Integer.class,Date.class); //利用构造constructor创建新实例 并传参调用此构造函数
Student stu = (Student) constructor.newInstance("Not_Copy","not_copy",25,new Date()); System.out.println(stu);
}
}

结果:

================使用获取到的构造方法=================
Student{name='Not_Copy', loginName='not_copy', age=25, Birthday=Mon Jul 22 21:49:12 CST 2019}

贴上 使用的 Student  和  People类:

People类

public class People {
public String head;
public String foot;
}

Student类:

import java.util.Date;

public class Student extends People{

    public String name;

    private String loginName;

    protected Integer age;

    Date Birthday;

    public Student(){
super();
} 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,String loginName){
this.name=name;
this.loginName=loginName;
} public Student(String name,Integer age,Date Birthday){
this.age=age;
this.name=name;
this.Birthday=Birthday;
} public Student(String name,String loginName,Integer age,Date Birthday){
this.name=name;
this.loginName=loginName;
this.age=age;
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;
} public String method1(String str){
System.out.println("public 修饰的方法:"+str);
return str;
} private String method2(){
System.out.println("private 修饰的方法:"+"method2");
return "method2";
} String method3(String name,Integer age,Date birthday){
System.out.println("protected 修饰的方法 method3 \n name:"+name+" age:"+age+" birthday:"+birthday);
return name+" "+age+" "+birthday;
} protected String method4(){
System.out.println("protected 修饰的方法:"+"method4");
return "method4";
} @Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", loginName='" + loginName + '\'' +
", age=" + age +
", Birthday=" + Birthday +
'}';
}
}

浅谈Java反射机制 之 使用类的 属性、方法和构造函数的更多相关文章

  1. 浅谈Java反射机制 之 获取类的字节码文件 Class.forName("全路径名") 、getClass()、class

    另一个篇:获取 类 的 方法 和 属性(包括构造函数) 先贴上Java反射机制的概念: AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它 ...

  2. 浅谈Java反射机制 之 获取类的 方法 和 属性(包括构造函数)

    上一篇 获取 类 的字节码文件 我们讲到了获取类的字节码文件的三种方法 第三种方法通过getClass("全路径名")获取字节码文件最符合要求 1.获取构造方法 先贴上我们要获取的 ...

  3. 浅谈java反射机制

    目录 什么是反射 初探 初始化 类 构造函数 属性 方法 总结 思考 什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意 ...

  4. 浅谈 java 反射机制

    一:Java反射概念 Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其mod ...

  5. Java -- 浅入Java反射机制

    1,Java 反射是Java语言的一个很重要的特征,它使得Java具体了"动态性". Java 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类. 在运行时构造任意一 ...

  6. 利用Java反射机制对实体类的常用操作工具类ObjectUtil

    代码: ObjectUtil类: import java.lang.reflect.Field; import java.math.BigDecimal; import java.text.Simpl ...

  7. 浅谈java发射机制

    目录 什么是反射 初探 初始化 类 构造函数 属性 方法 总结 思考 什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意 ...

  8. 浅谈Java反射

    什么是反射? JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语 ...

  9. 浅谈Java反射与框架

    Java反射 1.示例 1.用户类 package com.lf.entity; import com.lf.annotation.SetProperty; import com.lf.annotat ...

随机推荐

  1. mac 终端启动 jboss 停留在(Starting) 不能启动joss

    今天下载了jboss,解压后发现standalone.sh,不能够在终端中执行,于是google了一下,原来是由于jdk版本的问题导致jboss一直停在调试状态(貌似是这样说的). 需要把mac系统的 ...

  2. 结合php ob函数理解缓冲机制

    对于一个刚刚入门的php程序员来说,php缓冲区是几乎透明的.在他们心目中,一个echo print_r 函数,数据便会‘嗖’的一声飞到浏览器上,显示出来.我也一直如此单纯地认为. 其实,在技术的世界 ...

  3. Linux网络编程8——对TCP与UDP的简易封装

    引言 每次使用socket通信,都会有很对相似的操作.本文,会对TCP与UDP通信做一简单封装,并生成动态库. 代码 my_socket.h #ifndef __MY_SOCKET_H__ #defi ...

  4. [Audio processing] wav音频文件合并

    合并多个文件,需要包含1.文件读取和写入功能,2.数组合并 package com.audioprocessingbox.myfunc; import java.io.File; import jav ...

  5. [置顶] ssize_t与size_t-linux

    ssize_t: signed size_t [注释:signed 有符号] size_t: 标准C库中定义的,应为unsigned int [注释:unsigned 无符号] 一.size_t 增强 ...

  6. JDK1.8源码(五)——java.util.ArrayList 类

    关于 JDK 的集合类的整体介绍可以看这张图,本篇博客我们不系统的介绍整个集合的构造,重点是介绍 ArrayList 类是如何实现的. 1.ArrayList 定义 ArrayList 是一个用数组实 ...

  7. 一种dubbo逻辑路由方案(服务化隔离环境)

    背景介绍 现在很多的公司都在用dubbo.springcloud做为服务化/微服务的开发框架,服务化之后应用越来越多,链路越来越长,服务环境的治理变的很困难.比如:研发团队的人很多的,同时有几个分支在 ...

  8. 【XSY3154】入门多项式 高斯消元

    题目大意 给你一个 \(n\times n\)的矩阵 \(A\),求次数最小且最高次项为 \(1\) 的多项式 \(F(x)\),满足 \(F(A)=0\). 所有操作都对 \(p\) 取模. \(n ...

  9. HDU 6060 17多校3 RXD and dividing(树+dfs)

    Problem Description RXD has a tree T, with the size of n. Each edge has a cost.Define f(S) as the th ...

  10. Struts2框架的数据封装一之属性封装(属性封装的第二种方式:封装成javaBean)

    Struts2中提供了两类数据封装的方式? 第一种方式:属性驱动(有两种方式:一个对属性,另外一个是将参数封装到javaBean中) B. 在页面上,使用OGNL表达式进行数据封装.(将参数封装到ja ...