java反射使用实例

(java)反射的用法以及示例 主要介绍了常用的反射方法以及通过有效类全名获取类信息的实例 阅读详情

最近项目中用到了很多java反射机制,在阅读一些jar源码的过程中也发现了好多对于反射的使用,很经典。因此对其使用做了一些梳理,讲解直接注释在代码中。代码讲解的内容为基础使用。还有一部分是在项目中的使用还在总结中。

public interface B {


}

public interface B2 {


}


public class Book implements B,B2{
private String name;
private int pageNums;
private Double price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPageNums() {
return pageNums;
}
public void setPageNums(int pageNums) {
this.pageNums = pageNums;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "name: " + this.name + "page: " + pageNums + "price: " + price;
}

}


在类中测试:

package copyTable.wu.copy.util.reflact;


import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;


import org.apache.commons.collections.MapUtils;


public class ReflactTest {
/**
 * @Description: TODO(获取类名的三种方法) 
 * @date 2017年3月23日
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
getClassesBythreeWays();
getMethods();
getFields();
getInterface();
Book book = getInstance();
System.out.println(book.toString());
getInstanceAndFieldEval();
}


@SuppressWarnings("unused")
public static void getClassesBythreeWays(){
try {
/**
* 第一种方法,通过forName()方法获取
*/
Class<?> clazz = Class.forName("copyTable.wu.copy.util.reflact.Book");
System.out.println("第一种方法 :" + clazz.getName());
if(clazz == null){
System.out.println("反射失败。。。");
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/**
* 第二种方法,通过类名获取
*/
Class<?> clazz = Book.class;
System.out.println("第二种方法: "  + clazz.getName());
/**
* 第三种方法,通过getClass方法
*/
// Book book1 = new Book();
// Class<? extends Book> book = book1.getClass(); //第三种方法
Class<?> book = clazz.getClass();
System.out.println("第三种方法: "  + book.getName());
}
/**
* 
* @Description: TODO(获取对象的所有方法名称) 
* @date 2017年3月23日
* 获取到的方法列表:
* getPageNums  setPageNums  getPrice  setPrice  getName  setName  
* (Object的方法)wait  wait  wait  equals  toString  hashCode  getClass  notify  notifyAll  
*/
public static void getMethods(){
Class<?> clazz = Book.class;
Method[] methods = clazz.getMethods();
System.out.println("\n方法列表: ");
for(Method method : methods){
System.out.print(method.getName() + "  ");
}
}

//获取构造函数 Constructor<?>[] constructors = class1.getConstructors() ;
/**
 * @Description: TODO(获取所有属性) 
 * @date 2017年3月23日
 */
public static void getFields(){
Class<?> clazz = Book.class;
/**
*getDeclaredFields()获得某个类的所有申明的字段,即包括public、private和proteced
*但是不包括父类的申明字段。
*getFields()获得某个类的所有的公共(public)的字段,包括父类。
*/
Field[] fields = clazz.getDeclaredFields();
System.out.println("\n属性列表: ");
for(Field field : fields){
System.out.print(field.getName() + " ");
}
System.out.println("\n属性的范围: ");
for(Field field : fields){
System.out.println(field);
}
}
/**
* @Description: TODO(获取接口) 
* @date 2017年3月23日
*/
public static void getInterface(){
Class<?> clazz = Book.class;
Class<?>[] interfaceList = clazz.getInterfaces(); 
System.out.println("\n接口列表");
for(Class method : interfaceList){
System.out.print(method.getName() + "  ");
}
}
/**
* @Description: TODO(获取实例) 
* @date 2017年3月23日
*/
public static Book getInstance(){
Class<?> clazz = Book.class;
try {
Object obj = clazz.newInstance();
return (Book)obj;
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
/**
* @Description: TODO(实例化并给属性赋值) 
* @date 2017年3月23日
*/
public static void getInstanceAndFieldEval(){ 
Class<?> clazz = Book.class;
try {
Book book = (Book) clazz.newInstance();


Field field = clazz.getDeclaredField("name");
//由于name属性为private私有变量,所以不能直接访问,需要关闭jdk安全检查
//打破封装  实际上setAccessible是启用和禁用访问安全检查的开关,并不是为true就能访问为false就不能访问  
            //由于JDK的安全检查耗时较多.所以通过setAccessible(true)的方式关闭安全检查就可以达到提升反射速度的目的  
field.setAccessible(true);
field.set(book, "我的书名");
System.out.println("实例化并赋值后的book:"+ book.toString()); 

Method setName = clazz.getDeclaredMethod("setName", String.class);//String.class表示该setName的参数类型
setName.setAccessible(true);
setName.invoke(book, "我通过获取setName方法后修改的书名");
System.out.println("获取setName方法后修改的book:"+ book.toString()); 

//获取实例的书名
String name = (String) field.get(book);
System.out.println("通过field获取实例的书名:"+ name); 

Method getName = clazz.getDeclaredMethod("getName");
getName.setAccessible(true);
String nameByGetNameMethod = (String) getName.invoke(book);
System.out.println("通过使用Method实例调用getName方法获取的书名:"+ nameByGetNameMethod); 

//参数是int的处理,int类型不能使用integer会报错:
Method setPageNums = clazz.getDeclaredMethod("setPageNums", int.class);
setPageNums.setAccessible(true);
setPageNums.invoke(book, 222);
Method getPageNums = clazz.getDeclaredMethod("getPageNums");
getPageNums.setAccessible(true);
Integer pageNum = (Integer) getPageNums.invoke(book);
System.out.println("pageNum: " + pageNum);

//参数是Double的处理:
Method setPrice = clazz.getDeclaredMethod("setPrice", Double.class);
setPrice.setAccessible(true);
setPrice.invoke(book, 222.222);
// Method getPageNums = clazz.getDeclaredMethod("getPageNums", Double.class);
Method getPrice = clazz.getDeclaredMethod("getPrice");
getPrice.setAccessible(true);
// Integer pageNum = (Integer) getPageNums.invoke(book, Integer);
Double price = (Double) getPrice.invoke(book);
System.out.println("price: " + price);

} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

//下文总结来自:http://www.cnblogs.com/zhaoyanjun/p/6074887.html
//Constructor getConstructor(Class[] params)     根据构造函数的参数,返回一个具体的具有public属性的构造函数
//Constructor getConstructors()     返回所有具有public属性的构造函数数组
//Constructor getDeclaredConstructor(Class[] params)     根据构造函数的参数,返回一个具体的构造函数(不分public和非public属性)
//Constructor getDeclaredConstructors()    返回该类中所有的构造函数数组(不分public和非public属性)
//-------------------------------------------------------------------------------
//Method getMethod(String name, Class[] params)    根据方法名和参数,返回一个具体的具有public属性的方法
//Method[] getMethods()    返回所有具有public属性的方法数组
//Method getDeclaredMethod(String name, Class[] params)    根据方法名和参数,返回一个具体的方法(不分public和非public属性)
//Method[] getDeclaredMethods()    返回该类中的所有的方法数组(不分public和非public属性)
//-------------------------------------------------------------------------------
//Field getField(String name)    根据变量名,返回一个具体的具有public属性的成员变量
//Field[] getFields()    返回具有public属性的成员变量的数组
//Field getDeclaredField(String name)    根据变量名,返回一个成员变量(不分public和非public属性)
//Field[] getDelcaredField()    返回所有成员变量组成的数组(不分public和非public属性)

/**
* 高级使用法
*/

    public static <T> T transMap2Bean(Map<String,Object> props,T t) {
    if(MapUtils.isEmpty(props) || t==null){
    return t;
    }
try {
for(String field : props.keySet()){
Object val=props.get(field);
try {
String methodName=setMethodName(field);
Method method=t.getClass().getMethod(methodName, new Class[] { String.class });
if(method!=null){
method.invoke(t, val);
}
} catch (Exception e) {
}  
}
} catch (Exception e) {
e.printStackTrace();
return t;
}
return t;
}
    
public static String setMethodName(String fieldName){
StringBuffer methodName = new StringBuffer("set");
fieldName = fieldName.toLowerCase();
if(fieldName.indexOf("_") == 0){
methodName.append(fieldName);
}else{
methodName.append(toUpperCaseFirstOne(fieldName));
}
return methodName.toString();
}

//首字母转大写
    public static String toUpperCaseFirstOne(String s)
    {
        if(Character.isUpperCase(s.charAt(0)))
            return s;
        else
            return (new StringBuilder()).append(Character.toUpperCase(s.charAt(0))).append(s.substring(1)).toString();
    }
}

win10离线安装.NetFrameWork3.5出现0x800F081F解决办法。 由于公司开发环境是内网,并且安装arcgis10.2又需要.NetFrameWork3.5的环境,安装.NetFrameWork3.5的又总是报错“0x800F081F”找不到源文件。折腾了两天总算解决了。 首先我们能在网上搜索到的教程,你一定看到过这样的教程,就是使用下面的命令来进行安装。 dism /online /Enable-Feature /Featu... 阅读详情

相关推荐

变邻域搜索(VNS)原理梳理和应用细节-附求解VRPTW问题C++代码

文章目录1、简介-introduction2、VNS的基本机制2.1 变邻域下降方法-Variable Neighborhood Descent2.2基本变邻域搜索方法-Basic Variable Neighborhood Search2.3 终止准则3、VNS的拓展和混杂算法3.1 VNS的拓展3.2 变邻域分解搜索-Variable Neighborhood Decomposition Search3.3 偏变邻域搜索-Skewed VNS3.4 并行变邻域搜索-Parallel VNS4、VNS和其

dragon Fly的博客 6826

Java 反射详解和使用

反射(Reflection)机制是Java语言特性之一,是Java被视为动态(或准动态)语言的一个关键特性;

m0_58375976的博客 8325

Vc出现不能连接到一个或多个 vCenter server 系统:http://vcenter-vx.utibet.edu.cn:443/sdk

问题描述: 解决办法: esxi6.7的bug 第一种通过升级系统来解决问题 第二种是通过删除数据来解决 第一步:进入到esxi的shell 第二步查看其中的服务开启状态 第二步 df -h 第三步 /opt/vmware/vpostgres/current/bin/psql -d VCDB -U postgres 第四步 SELECT nspname || '.' || relname AS "relation", pg_size_pretty(pg_total_relation_size(C.oi

m0_49328536的博客 9898

Java 反射使用大全

好多年前自己记的关于Java反射的笔记,这么些年下来,自己用到反射的时候就看这一份就够了。但是笔记以文件形式存放不方便,所以将其放到优快云中,也希望能给更多小伙伴带来帮助。

朱豪凯的博客 9980

ZEMAX知识点:坐标间断面(coordinate break)

zemax知识点:坐标间断面

weixin_47638568的博客 1万+

手把手教你用开源EtherCAT协议栈SOEM开发从站设备(附避坑指南)

本文详细介绍了如何使用开源EtherCAT从站协议栈SOES进行嵌入式设备开发。内容涵盖从环境搭建、硬件准备到核心的对象字典与PDO映射配置,并重点分享了主循环集成、状态机处理以及实战调试中的常见问题与避坑指南,旨在帮助开发者高效实现设备接入工业现场总线网络。

linux的博客 625

java反射实操案例

一、反射介绍: 二、常用反射操作: 1、获取类对应的字节码对象(后缀为.class): (1)类对象.getClass() (2)类名.class (3)Class.forname("类的路径") 2、获取了类的Class对象后,可通过该字节码对象获取该类的多种信息 (1)测试用的学生类: (2)得到类属性的方法: (3)得到类方法的方法: (4)通过获取字节码,进而创建对象: (5)通过字节码对象获取包名、类名:

zhan_qian的博客 1802

Ubuntu系统下主板GPU温控pwm风扇

在Linux系统下——以Ubuntu为例,配置主板sys_fan等接口连接pwm温控风扇转速根据NVIDIA GPU温度,为服务器GPU等无主动散热显卡提供散热。

罗思哲的博客 5032

java反射使用(详细易懂,文末附Demo)

Reflection(反射) 是 Java 程序开发语言的特征之一,他的作用简单来说就是可以在程序运行过程中获取一个类的所有信息(包括成员变量,成员方法,构造器等),并且能够进行变量修改和方法调用。使用场景较多的是:在项目中接入了第三方框架,而其中某些类的属性和方法是私有的,无法获取、调用。这时可通过反射获取其成员变量、方法等信息,进行值的获取、修改、方法调用等等操作。{//私有属性//公有属性//构造方法{System.out.println("无参构造方法");}{

isenjouy的博客 4677

《通信工程施工与管理》

制作馈线接头必须使用专用的工具,专用工具包括:馈线切割刀、馈线安全刀、小金属丝毛刷、固定尺寸或大号活动扳手、小号扁锉刀、细齿小手锯、接头扩孔器、3M防水胶或防水接头盒;如图所示,详情如表所示。

2302_78710464的博客 1653

【速通RAG实战:索引】4.RAG文档解析技术

通过本文技术方案,可构建高精准、高效率的文档解析流水线,为 RAG 应用提供坚实的知识底座。核心在于**格式解析的鲁棒性**和**语义分块的准确性**,后续通过持续的性能优化和质量监控,逐步提升索引质量和检索效率。

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 1544

Java反射实例

  Java反射经典实例 Java Reflection Cookbook Java提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫——反射。反射机制是如今很多流行框架的实现基础,其中包括Spring、Hibernate等。原理性的问题不是本文的重点,接下来让我们在实例中学习这套精彩的机制。1. 得到某个对象的属性Code highlighting produced

xuan_oscar的专栏 6628

Python爬虫selenium验证-中文识别点选+图片验证码案例

环境对模型进行训练,参考:https://github.com/sml2h3/dddd_trainer。能识别,但是发现默认识别率有点低,想要提升识别率,可以搭建。截图每个字符,并基于ddddocr识别。根据坐标,在验证码上进行点击。

dme.的博客 2165

java反射怎么用_如何使用JAVA反射/JAVA反射实例

JAVA反射技术,在平时我们的开发中虽然很少会用到例如读取配制文件可能就用到这个技术,但在我们所使用的框架源码中是经常会用到的。1、常用举例:package com.test.instancedemo;class X{};public class GetClassDemo02{public static void main(String args[]){Class> c1 = null...

weixin_34524593的博客 398

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java反射创建实例_Java反射创建实例

Java反射创建实例package com.wkcto.chapter08.demo02;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException;/*** 通过反射创建对象(创建实例)* newInstance()** @author 蛙课网**/public class Tes...

weixin_39997037的博客 270

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java反射创建实例_java反射方式创建实例

在谈到实例的时候,很多人对这个概念还不能说出所以然。其实实例就是一个具体的对象,像我们之前学习的类、数组都可以创建实例。反射相对而言也是比较抽象的概念,所以我们是能够把它实例化的。下面简单对实例进行了解,然后分别带来无参和有参的反射实例实例化方法。1.实例说明new 一个对象是实例,可以把这个new出来的对象叫做实例,说白了就是这个new出来的“东西”,叫它对象也可以,叫它实例也可以,对象和实例在...

weixin_42415036的博客 596

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java反射实例化对象

Java 反射实例化对象 1、通过反射实例化对象 首先要获取目标类的class对象,可以通过以下三种方法 2、getConstructors和getDeclaredConstructors的区别 3、getFields和getDeclaredFields的区别

qq_45369827的博客 3950

java反射实例_JAVA反射实例

Java提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫——反射。反射机制是如今很多流行框架的实现基础,其中包括Spring、Hibernate等。原理性的问题不是本文的重点,接下来让我们在实例中学习这套精彩的机制。1. 得到某个对象的属性public Object getProperty(Object owner, String fieldName) throwsExcept...

weixin_39722965的博客 171

java 反射实例_java 反射的实例

JAVA反射机制是在运行状态中,对于任意一个类,都能够得到这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.概括一下:反射就是让你可以通过名称来得到对象(类,属性,方法)的技术。例如我们可以通过类名来生成一个类的实例;知道了方法名,就可以调用这个方法;知道了属性名就可以访问这个属性的值。1、获取类对应的C...

weixin_39953481的博客 355

Java反射系列--通过反射实例化对象

本文用示例介绍Java通过反射来实例化对象的方法。

IT利刃出鞘的博客 7060

java反射的原理,反射创建类实例的几种方式

java反射的原理,反射创建类实例的几种方式

xiaowangbadan0_0的博客 970

java反射实例_Java 反射实例

packagecom.reflect.test;importjava.lang.reflect.Array;importjava.util.Properties;public classTest {public static voidmain(String[] args) {try{/*Class> superUserClass = userClass.getSuperclass();Cla...

weixin_39759989的博客 153

反射 java 例子 get_Java反射实例

Java反射(Reflection)就是在运行 Java 程序时,可以加载、探知、使用编译期间完全未知的类。也就是说,Java 程序可以加载一个运行时才得知类名的类,获得类的完整构造方法,并实例化出对象,给对象属性设定值或者调用对象的方法。本文我们就来通过Java反射实例来理解Java中的反射机制。一、利用反射获取类信息的方式、获取当前类的所有方法和获取当前类及其父类的所有方法实体类package...

weixin_35315019的博客 334

java反射 例子_如何使用JAVA反射/JAVA反射实例

11、常用举例:package com.test.instancedemo;class X{};public class GetClassDemo02{public static void main(String args[]){Class> c1 = null ;// 指定泛型Class> c2 = null ;// 指定泛型Class> c3 = nul...

weixin_42376671的博客 201

【Java反射】通过反射调用类的实例方法

相关文章: 步骤 获取类对象 通过类对象,获取Method对象 通过Method对象的invoke方法,调用实例方法 TestReflection4.java package study; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class TestReflection4 { public static void main(String[] args)

Awt_FuDongLai的博客 5334

java反射创建实例_java反射小实例

利用反射实现对配置文件的更改达到更改方法的目的文件夹目录首先Student类中有个sleep方法pro.properties定义了参数最后是RelectTestMain。package com.reflex.test;import java.io.IOException;import java.io.InputStream;import java.lang.reflect.InvocationTa...

weixin_39884872的博客 347
上一篇: override报错,继承自接口的类报错:***must override a superclass method
下一篇: "could not create the java virtual machine"启动eclipse报错
国服第l帅
博客等级 码龄12年 26粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值