Java反射学习-3 - 反射获取属性,方法,构造器

package cn.tx.reflect; import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
/**
* 三 、Class类中要掌握的方法:
* 反射获取具体属性、方法、构造器
* @author Administrator
*
*/
public class ReflectLearn3 { public static void main(String[] args) throws Exception { Class<?> clazz = Class.forName("cn.tx.reflect.Person");
//1.反射获取类的属性值
Field field = clazz.getDeclaredField("address");
System.out.println("反射获取到的类的属性信息为:" + field);
//打印结果: 反射获取到的类的属性信息为:private java.lang.String cn.tx.Person.address
//设置属性:首先获取对象 //2.反射获取方法:必须指定要获取的方法名和该方法的返回值类型,只靠方法名是不行的,还需要知道方法参数列表中的参数类型
/*Method java.lang.Class.getDeclaredMethod(String name, Class<?>... parameterTypes)
*Class<?>... 是可变参数,表示一个元素个数不确定的Class数组 */
//Person类的getName()方法,没有形参,Class数组写new Class[]{}
Method method = clazz.getDeclaredMethod("getName", new Class[]{});
System.out.println("获取到的getName()方法:"+method);//获取到的getName()方法:public java.lang.String cn.tx.Person.getName()
Method method2 = clazz.getDeclaredMethod("setName", new Class[]{String.class}); //setName方法有一个String类型的形参
System.out.println("获取到的setName()方法:"+method2);//获取到的getName()方法:public java.lang.String cn.tx.Person.getName() //3.反射获取无参构造器Constructor<?> java.lang.Class.getDeclaredConstructor(Class<?>... parameterTypes)
Constructor<?> constructor = clazz.getDeclaredConstructor(new Class[]{}); //参数为类的类对象数组
System.out.println(constructor); //打印public cn.tx.Person()
Constructor<?> constructor2 = clazz.getDeclaredConstructor(new Class[]{Integer.class,String.class,String.class});
System.out.println(constructor2); //public cn.tx.Person(java.lang.Integer,java.lang.String,java.lang.String) //4.使用构造器创建对象: Constructor类的public T newInstance(Object ... initargs)
Object object = constructor.newInstance(new Object[]{});
System.out.println(object); //Person [address=null, id=null, name=null]
// Object object2 = constructor.newInstance(new Object[]{1,"李四","北京"});
Object object2 = constructor2.newInstance(1,"李四","北京");
System.out.println(object2);//Person [address=北京, id=1, name=李四] //5.设置属性
//获得类的所有方法
Method[] methods = clazz.getDeclaredMethods();
for (Method m : methods) {
//获得方法的名字;
String name = m.getName(); // 在这一行打断点,F6单步调试,查看反射掉调用过程
if(name.startsWith("set")){
//获得set字符串后面的值
String fieldName = name.substring(3);
//获得属性名
fieldName = fieldName.substring(0,1).toLowerCase()+ fieldName.substring(1);
//获得方法对应的属性
Field field2 = clazz.getDeclaredField(fieldName);//注意,不是getField()
//获得属性对应的具体类型
Class<?> type = field2.getType();
if(type == Integer.class){
//通过method对象反射调用Person类的方法,第一个参数是调用方法的对象,第二个参数是方法的实参值
m.invoke(object2, 2); //相当于person.setId(2)
}
if(type == String.class && "address".equals(fieldName)){
m.invoke(object2, "南京");
}
if(type == String.class && "name".equals(fieldName)){
m.invoke(object2, "tom");
}
}
} //6.直接设置属性:field.setAccessible(true)
Field field2 = clazz.getDeclaredField("name");
field2.setAccessible(true);//让私有的属性可以被访问
field2.set(object2, "marry");
System.out.println(object2); }
}

结果如下:

原文地址:https://www.cnblogs.com/enjoyjava/p/9135556.html
Java反射学习-3 - 反射获取属性,方法,构造器的更多相关文章
- Java反射学习-1 - 反射获取类的属性,方法,构造器
新建一个Person类 package cn.tx.reflect; /** * 注解初步了解 * @author Administrator * */ public class Person { p ...
- Java反射《三》获取属性
package com.study.reflect; import java.lang.reflect.Field; /** * 反射,获取属性 * @ClassName: FieldDemo * @ ...
- Java反射学习-4 - 反射调用方法
反射调用方法: package cn.tx.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Method ...
- java-通过反射获取目标类的属性,方法,构造器
首先定义一个urse package com.studay_fanshe; public class User { private String uname; private int age; pri ...
- java 日常学习记录-反射
Hero类 package helloworld; public class Hero { public String name; //姓名 public float hp; //血量 public ...
- Java反射学习-5 - 反射复制对象
通过反射方式复制对象: package cn.tx.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Fi ...
- 【java基础学习】反射
1. 什么是反射 Class.Method.Field.Constructor,它们是反射对象.它们是类.方法.成员变量.构造器,在内存中的形式. 也就是万物皆对象!类是类型.方法是类型.成员变量是类 ...
- Java基础学习(1)——反射
反射就是把Java类中的各种成分映射成相应的Java类(主要用于框架开发) 反射的基石–>Class类 Java程序中的各个类属于同一事物,描述这类事务的Java类名就是Class. Class ...
- java反射学习之一反射机制概述
一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...
随机推荐
- QLCDNumber
继承于 QFrame 展示LCD样式的数字,它可以显示几乎任何大小的数字,它可以显示十进制,十六进制,八进制或二进制数 能够展示的字符: 0/O, 1, 2, 3, 4, 5/S, 6, 7, 8, ...
- linux运维、架构之路-linux基础知识
1.PATH环境变量 LANG ——————>变量名字 $LANG ——————>查看变量内容 LANG= ——————>修改变量 系统环境变量填加内容前面使用export expo ...
- C#知识点:委托、事件、正则表达式、SVN、找按段等差递增至不变序列的规律
using System; using System.Collections.Generic; using System.Text; namespace Delegate { //定义委托,它定义了可 ...
- dede后台系统基本参数空白怎么办?
dede后台系统基本参数空白怎么办? 如图: 解决办法:还原dede_sysconfig表即可 后台 系统-SQL命令行工具,执行如下sql delete table dede_sysconfig ...
- VS2015编译问题:模块对于 SAFESEH 映像是不安全的
严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK2026 模块对于 SAFESEH 映像是不安全的. zlibvc C:\MyDirectory\test2\zlib-\contrib\ ...
- Vux的安装使用
1.Vux的安装 1.1.vue-cli的vux模板生成项目 可以直接使用 vue-cli 的模板生成一个 vux 项目 vue init airyland/vux2 projectName 由此可以 ...
- [UVA160]Factors and Factorials 题解
前言 这道题目本身毫无技术含量珂言,但是输出格式珂以调一年 题解 这道题让我们求\(N!\)中每个质数的个数. 一种方法是直接模拟,枚举\(N!\)中的每个元素,然后暴力查看每个数含有有多少质数. 但 ...
- select标签的下拉框为图片的插件
1 参考文献: [1] https://github.com/rvera/imag...[2] https://rvera.github.io/image... [3] http://webseman ...
- 双边滤波Matlab代码
%简单地说: %A为给定图像,归一化到[,]的矩阵 %W为双边滤波器(核)的边长/ %定义域方差σd记为SIGMA(),值域方差σr记为SIGMA() %%%%%%%%%%%%%%%%%%%%%%%% ...
- iOS 命令行打包--xcworkspace
参考: 打包的具体操作步骤: https://www.jianshu.com/p/6a0aa8cd2e97 打包时使用到的参数详解,参考这篇: https://debugtalk.com/post/i ...