技术标签: Java propertyName 动态代理 invoke 越过泛型 InvocationHandler
概述:AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。
而解剖使用的就是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象
Object类的getClass()方法,判断两个对象是否是同一个字节码文件
静态属性class,锁对象
Class类中静态方法forName(),读取配置文件
1、new Person().getClass();
2、Person.getClass();
3、Class.forName();
//获取多个看得见的构造函数
Constructor[] cons = c.getConstructors();
//获取所有的构造函数
Constructor[] cons1 = c.getDeclaredConstructors();
//获取单个构造函数
//返回能看见的无参构造函数对象
Constructor con1 = c.getConstructor();
Object obj = con1.newInstance();
//返回能看见的带参构造函数对象
Constructor con2 = c.getConstructor(String.class,int.class);
Object obj1 = con2.newInstance("张三",15);
//返回私有构造函数的对象,都能获取
Constructor con3 = c.getDeclaredConstructor(String.class);
con3.setAccessible(true);
Object obj2 = con3.newInstance("zhangsan");
Class c = Class.forName(path);
Constructor con = c.getConstructor();
Object obj = con.newInstance;
//获取所有的公共的成员变量
Field[] fields1 = c.getFields();
//获取所有的成员变量
Field[] fields2 = c.getDeclaredFields();
//获取单个公共的成员变量
Field addressField = c.getField("name");
String s = addressField.set(obj,"zhangsan");
//获取私有的成员变量(所有的)
Field idField = c.getDeclaredField("id");
idField.setAccessible(true);
String id = idField.set(obj,"430...01");
Constructor con = c.getConstructor();
Object obj = con.newInstance();
//获取自己包含父类的所有公共方法
Method[] methods1 = c.getMethods();
//获取自己的所有方法(没有父类的)
Method[] methods2 = c.getDeclaredMethods();
//获取单个公共的方法
Method method3 = c.getMethod(methodName,String.class); //methodName=show
//调用obj对象的show(String s,int i)
method3.invoke(obj,"zhangsan",22);
//获取单个的私有方法(所有方法)
Method method4 = c.getDeclaredMethod(methodName2); //methodName2=run
method4.setAccessible(true);//取得访问权限
method4.invoke(obj);
此方法可将obj对象中名为propertyName的属性的值设置为value
public void setProperty(Object obj, String propertyName, Object value){
}
在程序运行过程中产生的这个对象,而程序运行过程中产生对象其实就是我们刚才反射讲解的内容,所以,动态代理其实就是通过反射来生成一个代理
在Java中java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口就可以生成动态代理对象。JDK提供的代理只能针对接口做代理。我们有更强大的代理cglib,Proxy类中的方法创建动态代理类对象
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
最终会调用InvocationHandler的方法
InvocationHandler Object invoke(Object proxy,Method method,Object[] args)
1、通过原始的Java反射机制的方式调用资源
2、Activity的启动过程中Activity的对象的创建
问题:Spring Cloud Version:Hoxton.SR3 Spring Cloud Alibaba Version:2.2.0.RELEASE项目中consumer端使用@FeignClient定义接口,启动报错:Caused by: java.lang.AbstractMethodError: com.alibaba.cloud.sentinel.feign.Senti...
项目代码下载:http://java.net/projects/oraclesoasuite11g/downloads/download/OSB/osb-101-helloworld.zip更多OSB学习资料,示例代码和视频参考:http://java.net/projects/oraclesoasuite11g/pages/OSB本项目操作演示视频请移步至本文末尾,拖放到后半段。
1、背景介绍最近为了使用PCIe驱动,对Linux内核进行了升级,目前ZYNQ发布的最新版内核为2017.4(对应内核版本4.9),升级虽然解决了PCIe驱动问题,但却引入了另一个奇怪的问题-挂载JFFS2文件系统时会出现如下错误:jffs2: jffs2_scan_eraseblock(): Node at 0x0000225c {0x1985, 0xe002, 0xe002e002) has ...
在Blender中,事件主要指以下内容(参见:https://wiki.blender.org/index.php/Dev:2.5/Source/Architecture/Window_Manager)键盘、鼠标、设备、计时器custom data (tablet, drag n drop)modifier state, mouse coordskey modifie...
#include <iostream>#include "opencv2/opencv.hpp"#include "opencv2/xfeatures2d.hpp"using namespace std;typedef struct{ cv::Point2f left_top; cv::Point2f left_bottom; cv::Point2f right_top; cv::Point2f right_bottom;}four_corners_t;void Ca.
1. 问题描述: 今天在使用Tomcat8发布多个项目的时候,不知是误点击了什么还是怎么的。在eclipse中启动tomcat后,访问时显示not found 404错误 ,换用不同的Tomcat依旧不能解决问题。参考如下图: 奇怪了,纠结了一段时间 ··· ··· 最后知道 eclipse的问题了,应该不是软件的什么bug,应该是某个地方设置有问题,从这个角
QUESTION NO: 371 Which NLS parameter can be used to change the default Oracle sort method from binary to linguistic for the SQL SELECT statement? A. NLS_LANG B. NLS_COMP C. NLS_SORT D. None of t
之前讲过Matplotlib以及作图的一些小技巧。那么,小编问大家Matplotlib面向对象是什么?有的人就答不上来了。接下来我们一起探究。Matplotlib中常⽤对象的包含关系为Figure > Axes > (Line2D, Text,etc.)。Figure对象表示一整张图表;其中可包含多个绘图区域,可以理解为多个坐标轴,用Axes表示,也可以称之为子图;在每一个子图中绘制具...
定义IllegalScoreException异常类,代表分数相加后超出合理范围的异常。该异常是checked exception,即希望该异常一定要被捕获处理。定义IllegalNameException异常类,代表名字设置不合理的异常。该异常是unchecked exception定义Student类。属性:private String name;private int score;方法:toString //自动生成setter/getter //自动生成改
直接贴代码面向过程import matplotlib.pyplot as pltimport randomfrom pylab import mpl# 设置显示中文字体mpl.rcParams["font.sans-serif"] = ["SimHei"]mpl.rcParams["axes.unicode_minus"] = False# 画出温度变化图# 0.准备x, y...
Oracle在最近发布了一个通告。原文如下: 引用In Enterprise Manager Database Control with Oracle Database 10.2.0.4 and 10.2.0.5, the root certificate used to