Java反射的用法
Class类
在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息。
反射
Java的反射主要就是使用class对象生成对应类的实例、调用类的方法等对操作。示例代码:
Car.java
public class Car {
private String brand;
private String color;
private Integer maxSpeed;
public Car() {
}
public Car(String brand, String color, Integer maxSpeed) {
super();
this.brand = brand;
this.color = color;
this.maxSpeed = maxSpeed;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Integer getMaxSpeed() {
return maxSpeed;
}
public void setMaxSpeed(Integer maxSpeed) {
this.maxSpeed = maxSpeed;
}
@Override
public String toString() {
return "Car [brand=" + brand + ", color=" + color + ", maxSpeed="
+ maxSpeed + "]";
}
public void testPrivate() {
System.out.println("call testPrivate()");
}
}
ReflectTest.java
public class RelectTest {
public static void main(String[] args) throws ClassNotFoundException,
InstantiationException, IllegalAccessException, SecurityException,
NoSuchFieldException, NoSuchMethodException,
IllegalArgumentException, InvocationTargetException {
// 创建class,方法1
Class<?> clazz = Class.forName("com.Car");
// 创建class,方法2,相对来说,方法1更适合从配置中读取包的限定名字符串,避免了方法2中需要导包的操作
clazz = Car.class;
// 创建对象
Car car = (Car) clazz.newInstance();
// 获取所有的属性
Field[] fields = clazz.getDeclaredFields();
System.out.print("All fields:");
for (Field field : fields) {
System.out.print(field.getName() + ",");
}
System.out.println();
// 获取所有的public属性
Field[] publicFilds = clazz.getFields();
System.out.print("All public fields:");
for (Field field : publicFilds) {
System.out.print(field.getName() + ",");
}
System.out.println();
// 获取继承或接口中的所有方法
Method[] methods = clazz.getMethods();
System.out.println("All methods:");
for (Method method : methods) {
System.out.println(method.getReturnType() + " " + method.getName()
+ "(" + displayClass(method.getParameterTypes()) + ")");
}
System.out.println();
// 获取本类中的public, protected, private方法,不包括继承的方法
Method[] selfMethods = clazz.getDeclaredMethods();
System.out.println("All self methods:");
for (Method method : selfMethods) {
System.out.println(method.getReturnType() + " " + method.getName()
+ "(" + displayClass(method.getParameterTypes()) + ")");
}
System.out.println();
// 获取构造函数
Constructor[] constructors = clazz.getDeclaredConstructors();
System.out.println("All Constructor:");
for (Constructor constructor : constructors) {
System.out.println(constructor.getName() + "("
+ displayClass(constructor.getParameterTypes()) + ")");
}
System.out.println();
// 获取指定的属性
Field brandField = clazz.getDeclaredField("brand");
// 通过属性为字段赋值
brandField.setAccessible(true);// 由于brand属性为private,必须设置覆盖java对该字段的访问控制检查
brandField.set(car, "奔驰");
System.out.println(car);
// 获取指定的方法
Method colorSetMethod = clazz.getDeclaredMethod("setColor",
String.class);
colorSetMethod.invoke(car, "黑色");
System.out.println(car);
Method testPrivateMethod = clazz.getDeclaredMethod("testPrivate");
testPrivateMethod.invoke(car, null);
}
public static String displayClass(Class[] s) {
StringBuilder sb = new StringBuilder();
for (Class c : s) {
if (sb.length() > 0)
sb.append(", ");
sb.append(c.getName());
}
return sb.toString();
}
}
Java反射的用法的更多相关文章
- java反射-- Field 用法实践
java 反射是一种常用的技术手段, 通过加载类的字节码的方式来获取相关类的一些信息 比如成员变量, 成员方法等. Field 是什么呢? field 是一个类, 位于java.lang.reflec ...
- Java 反射经常用法演示样例
<pre name="code" class="java">import java.lang.reflect.Constructor; import ...
- Java 反射的用法 有关Class类的解释
package com.imooc.test;public class ClassDemo1 { public static void main(String[] args) { Foo fool = ...
- 不藏了,这些Java反射用法总结都告诉你们
摘要:Java反射是一种非常强大的机制,它可以在同一个系统中去检测内部的类的字段.方法和构造函数.它非常多的Java框架中,都大量应用了反射技术,如Hibernate和Spring.可以说,反射机制的 ...
- Java Spring IOC用法
Java Spring IOC用法 Spring IoC 在前两篇文章中,我们讲了java web环境搭建 和 java web项目搭建,现在看下spring ioc在java中的运用,开发工具为In ...
- Java反射的理解
反射的作用: 1.运行时检查类的结构 2.运行时更改类的字段值 3.调用类的方法 准备知识: Class类:虚拟机为每一个对象保存的一份对象所属类的清单: static Class for ...
- java 反射 动态代理
在上一篇文章中介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大 ...
- java反射机制 + Method.invoke解释 getMethod + 反射理解
功能: 通过读取另一个Dll去创建一个控件(Form,Button,TextBox,DataGridView),然后对当中一些属性进行检查. 创建控件的大致流程是,Assembly->Modul ...
- Java反射机制深度剖析
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! Java反射机制是Java语言中一种很重要的机制,可能在工作中用到的机会不多,但是在很多框架中都有用到这种机制.我们知道Java是一门静态 ...
随机推荐
- STM32 串口中断总结
原文:https://blog.csdn.net/weixin_42480952/article/details/82981409 最近在学习使用dma传输方式进行串口通讯,感觉这个很详细,存一下 . ...
- 关于Flume中Chanel.Selector.header解释
flume内置的ChannelSelector有两种,分别是Replicating和Multiplexing. Replicating类型的ChannelSelector会针对每一个Event,拷贝到 ...
- gdb中信号
信号(Signals) 信号是一种软中断,是一种处理异步事件的方法.一般来说,操作系统都支持许多信号.尤其是UNIX,比较重要应用程序一般都会处理信号.UNIX定义了许 多信号,比如SIGINT表示中 ...
- 文理分科 BZOJ3894 & happiness BZOJ2127
分析: 最小割(一开始我没看出来...后来经过提点,大致理解...),不选则割的思想. 我们先这样考虑,将和选理相关的和S相连,与选文相关的和T相连,如果没有第二问,那么建图就是简单的S连cnt,cn ...
- 20155330 《网络攻防》 Exp3 免杀原理与实践
20155330 <网络攻防> Exp3 免杀原理与实践 基础问题回答 杀软是如何检测出恶意代码的? 基于特征码.先对流行代码特征的提取,然后进行程序的比对,如果也检测到相应的特征码的程序 ...
- vue-cli 动态绑定图片失败
1.template 中引用图片,第一个为固定路径,第二个为动态绑定路径 eg: <img src="XXXXXX.png" alt=""> < ...
- Linux下设置和查看环境变量
Linux的变量种类 按变量的生存周期来划分,Linux变量可分为两类: 1 永久的:需要修改配置文件,变量永久生效. 2 临时的:使用export命令声明即可,变量在关闭shell时失效. 设置变量 ...
- 11、Dockerfile实战-Tomcat
一.编写Dockerfile 具体步骤这里不再细说,直接看Dockerfile文件: FROM centos:7 MAINTAINER QUNXUE ENV VERSION=8.0.46 RUN yu ...
- Altium CAED 国际认证操作题例题(含下载)
官网介绍页面 https://www.altium.com.cn/certification 共五套操作题 含资料 蓝奏云:https://www.lanzous.com/i2lj1ng 百度网盘:h ...
- Jupyter Notebook 工作空间 / 默认路径 的设置方式
Jupyter notebook 安装后,启动后,默认的工作空间是当前用户目录.为了方便对文档进行管理,往往需要自行设置工作空间. 下面介绍两种亲试有效的工作空间设置方法. 1.修改快捷方式 对 Ju ...