java.lang.Class<T> -- 反射机制及动态代理
Interface : Person
package java_.lang_.component.bean; public interface Person { String area = "earth"; public void userAxe(); public void personLaught();
}
Class : Teacher
package java_.lang_.component.bean.impl; import java_.lang_.component.bean.Person; public class Teacher {
private String subject;
private Person[] sudents; public String getSubject() {
return subject;
} public void setSubject(String subject) {
this.subject = subject;
} public Person[] getSudents() {
return sudents;
} public void setSudents(Person[] sudents) {
this.sudents = sudents;
}
}
Class : Chinese
package java_.lang_.component.bean.impl; import java_.lang_.component.bean.Axe;
import java_.lang_.component.bean.Person; public class Chinese extends Teacher implements Person { private String name;
private Axe axe;
public String commonPro; public Chinese(String name, Axe axe) {
super();
this.name = name;
this.axe = axe;
} public String getCommonPro() {
return commonPro;
} public void setCommonPro(String commonPro) {
this.commonPro = commonPro;
} public Chinese() {
super();
// TODO Auto-generated constructor stub
} @Override
public String toString() {
return "Chinese [name=" + name + ", axe=" + axe + "]";
} @Override
public void userAxe() {
System.out.println(name + " 说 : " + axe.chop());
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Axe getAxe() {
return axe;
} public void setAxe(Axe axe) {
this.axe = axe;
} @Override
public void personLaught() {
System.out.println("laught");
} public void exception() throws InterruptedException{
Thread.sleep(1000);
} }
Interface :Axe
package java_.lang_.component.bean; public interface Axe { public String chop();
}
Class : SteelAxe
package java_.lang_.component.bean.impl; import java_.lang_.component.bean.Axe; public class SteelAxe implements Axe { @Override
public String chop() {
return "用钢斧砍柴真快";
} }
Class :Class_T
package java_.lang_; import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List; import java_.lang_.component.bean.Axe;
import java_.lang_.component.bean.Person;
import java_.lang_.component.bean.impl.Chinese;
import java_.lang_.component.bean.impl.SteelAxe;
import java_.lang_.component.bean.impl.Teacher; //T - 由此 Class 对象建模的类的类型。例如, String.class 的类型是 Class<String>。如果将被建模的类未知,则使用 Class<?>。
//Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,
//所有具有相同元素类型和维数的数组都共享该 Class 对象。
//基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。 //Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。
public class Class_T { public static void main(String[] args) throws Exception{
Chinese chinese = new Chinese();
System.out.println(chinese.getClass().getName());
System.out.println(chinese.getClass());
System.out.println("----------------------Class类的常用方法--------------");
// 传入完整的“包.类”名称实例化Class对象
Class<?> clazzChinese = Class.forName("java_.lang_.component.bean.impl.Chinese");
// 得到一个类中的全部构造方法,按类中构造方法的顺序排列:无参、有参:0、1
System.out.println("得到一个类中的全部构造方法");
Constructor[] constructorsChinese = clazzChinese.getConstructors();
for(Constructor<?> constructor : constructorsChinese){
System.out.println(constructor);
}
// 得到本类中单独定义的全部属性
System.out.println("得到本类中单独定义的全部属性");
Field[] fieldDeclaredsChinese = clazzChinese.getDeclaredFields();
for(Field fieldDeclared : fieldDeclaredsChinese){
System.out.println(fieldDeclared);
}
// 取得本类继承而来的全部属性
System.out.println("取得本类继承而来的全部属性");
Field[] fields = clazzChinese.getFields();
for(Field field : fields){
System.out.println(field);
}
// 得到一个类中的全部方法
System.out.println("得到一个类中的全部方法");
Method[] methods = clazzChinese.getMethods();
for(Method method : methods){
System.out.println(method);
}
// 返回一个Method对象,并设置一个方法中的所有参数类型
System.out.println("返回一个Method对象,并设置一个方法中的所有参数类型");
Method method = clazzChinese.getMethod("setName", String.class);
Chinese lime = (Chinese) clazzChinese.newInstance();
method.invoke(lime, "lime");
System.out.println(lime.getName());
// 得到一个类中所有实现的全部接口
System.out.println("得到一个类中所有实现的全部接口");
Class[] interfaces = clazzChinese.getInterfaces();
for(Class<?> interfaceClass : interfaces){
System.out.println(interfaceClass);
}
// 得到一个类完整的“包.类”名称
System.out.println("得到一个类完整的“包.类”名称");
System.out.println(clazzChinese.getName());
// 得到一个类的包
System.out.println("得到一个类的包");
System.out.println(clazzChinese.getPackage());
// 得到一个类的父类
System.out.println("得到一个类的父类");
System.out.println(clazzChinese.getSuperclass());
// 根据Class定义的类实例化对象
System.out.println("根据Class定义的类实例化对象");
Teacher teacher = (Teacher) clazzChinese.newInstance();
System.out.println(teacher);
// 返回表示数组类型的Class
System.out.println("返回表示数组类型的Class");
Class<? extends Person[]> clazzArray = new Person[]{}.getClass();
System.out.println(clazzArray);
// 判断此Class 是否是一个数组
System.out.println("判断此Class 是否是一个数组");
if(clazzArray.isArray()){
System.out.println("isArray");
}else{
System.out.println("not isArray");
}
System.out.println("budong");
// 通过无参构造实例化对象
System.out.println("通过无参构造实例化对象");
Chinese china = (Chinese) clazzChinese.newInstance();
System.out.println(china);
// 调用有参构造实例化对象
System.out.println("调用有参构造实例化对象");
Constructor[] constructorsChina = clazzChinese.getConstructors();
Person person = (Person) constructorsChina[0].newInstance("lime",new SteelAxe());
person.userAxe();
System.out.println("-------------Constructor常用方法--------------------");
// 得到构造方法的修饰符
System.out.println("得到构造方法的修饰符");
int modifier = constructorsChina[0].getModifiers();
System.out.println(modifier);
System.out.println(Modifier.toString(modifier));
// 得到构造方法的名称
System.out.println("得到构造方法的名称");
System.out.println(constructorsChina[0].getName());
// 得到构造方法中参数的类型
System.out.println("得到构造方法中参数的类型");
Class[] parameterTypes = constructorsChina[0].getParameterTypes();
for(Class<?> parameterType : parameterTypes){
System.out.println(parameterType);
}
// 返回此构造的信息
System.out.println("返回此构造的信息");
for(Constructor<?> constructor : constructorsChina){
System.out.println(constructor.toString());
}
// 向构造方法中传递参数,实例化对象
System.out.println("向构造方法中传递参数,实例化对象");
Chinese per = (Chinese) constructorsChina[0].newInstance("lime",new SteelAxe());
System.out.println(per.toString()); System.out.println("----------------------反射的应用------取得类的结构-----------------"); System.out.println("-----------------------取得全部方法--------------------");
System.out.println("---------------------Method类中的常用方法---------------");
// 取得本方法的访问修饰符
System.out.println("取得本方法的访问修饰符");
Method meth = clazzChinese.getDeclaredMethod("setName",String.class);
System.out.println(meth.getModifiers());
System.out.println(Modifier.toString(meth.getModifiers()));
// 获取方法的名称
System.out.println("获取方法的名称");
Method[] meths = clazzChinese.getDeclaredMethods();
for(Method metho : meths){
System.out.println(metho.getName());
}
// 得到方法的全部参数类型
System.out.println("得到方法的全部参数类型");
for(Method metho : meths){
System.out.println(metho.getName());
Class[] params = metho.getParameterTypes();
for(Class<?> param : params){
System.out.println(param);
}
}
// 得到方法的返回值类型
System.out.println("得到方法的返回值类型");
for(Method metho : meths){
System.out.print(Modifier.toString(metho.getModifiers()) + " ");
System.out.println(metho.getReturnType());
}
// 得到一个方法的全部抛出异常
System.out.println("得到一个方法的全部抛出异常");
Method methodException = clazzChinese.getMethod("exception");
System.out.print(Modifier.toString(methodException.getModifiers()) + " ");
System.out.print(methodException.getReturnType() + " ");
System.out.print(methodException.getName() + "(");
Class[] paramMethods = methodException.getParameterTypes();
if(paramMethods.length > 0){
for(int i = 0;i < paramMethods.length - 1;i++){
System.out.print(paramMethods[i].getName().substring(paramMethods[i].getName().lastIndexOf(".")) + ",");
}
System.out.print(paramMethods[paramMethods.length-1]);
}
System.out.print(") throws ");
Class[] exceptionClasses = methodException.getExceptionTypes();
if(exceptionClasses.length > 0){
for(int i = 0;i < exceptionClasses.length - 1;i++){
System.out.print(exceptionClasses[i].getName().substring(exceptionClasses[i].getName().lastIndexOf(".")) + ", ");
}
System.out.println(exceptionClasses[exceptionClasses.length-1].getName());
}
for(Class<?> exce : exceptionClasses){
System.out.println(exce);
} System.out.println("---------------------------------------------");
System.out.println("--------------------获取全部属性-----------------");
System.out.println("----------------Field类的常用方法----------------");
// 得到一个对象中属性的具体内容
System.out.println("得到一个对象中属性的具体内容");
Chinese ch = (Chinese) clazzChinese.newInstance();
Field commonPro = clazzChinese.getDeclaredField("commonPro");
System.out.println(commonPro.getName() + " isAccessible " + commonPro.isAccessible());
commonPro.set(ch, "lime");
commonPro.get(ch);
System.out.println(ch.getCommonPro());
Field name = clazzChinese.getDeclaredField("name");
System.out.println(name.getName() + " isAccessible " + name.isAccessible());
if(name.isAccessible()){
}else{
name.setAccessible(true);
name.set(ch, "Oracle");
name.get(ch);
System.out.println(ch.getName()); }
// 设置指定对象中属性的具体内容
System.out.println("设置指定对象中属性的具体内容");
// 得到属性的修饰符
System.out.println("得到属性的修饰符");
System.out.println(commonPro.getModifiers());
System.out.println(Modifier.toString(commonPro.getModifiers()));
// 返回此属性的名称
System.out.println("返回此属性的名称");
System.out.println(commonPro.getName());
// 判断此属性是否可被外部访问
System.out.println("判断此属性是否可被外部访问");
System.out.print(Modifier.toString(commonPro.getModifiers()) + " ");
if(commonPro.isAccessible()){
System.out.println("isAccessible");
}else{
System.out.println("not isAccessible");
}
System.out.print(Modifier.toString(clazzChinese.getDeclaredField("name").getModifiers()) + " ");
if(clazzChinese.getDeclaredField("name").isAccessible()){
System.out.println("isAccessible");
}else{
System.out.println("not isAccessible");
}
// 设置一个属性是否可被外部访问
System.out.println("设置一个属性是否可被外部访问");
commonPro.setAccessible(true);
if(commonPro.isAccessible()){
System.out.println("isAccessible");
}else{
System.out.println("not isAccessible");
}
// 设置一组属性是否可被外部访问
System.out.println("设置一组属性是否可被外部访问");
Field[] fieldsAll = clazzChinese.getDeclaredFields();
System.out.println("设置前");
for(Field field : fieldsAll){
System.out.println(field.getName() + " isAccessible:" + field.isAccessible());
}
for(Field field : fieldsAll){
field.setAccessible(true);
}
System.out.println("全部设置为true");
for(Field field : fieldsAll){
System.out.println(field.getName() + " isAccessible:" + field.isAccessible());
}
// 获取属性的类型
System.out.println("获取属性的类型");
for(Field field : fieldsAll){
System.out.println(field.getName() + " " + field.getType());
}
// 获取继承父类的全部属性
System.out.println("获取继承父类的全部属性");
Field[] fieldsDeclared = clazzChinese.getFields();
for(Field field : fieldsDeclared){
System.out.println(field.getName());
}
System.out.println("----------------------------------------------");
System.out.println("-------------------Java反射机制的深入应用-------------");
System.out.println("-------------通过反射调用类中的方法-------------------");
// 通过反射调用类中的方法
System.out.println("通过反射调用类中的方法");
{
Method methodSetAxe = clazzChinese.getDeclaredMethod("setAxe", Axe.class);
Chinese chin = (Chinese) clazzChinese.newInstance();
methodSetAxe.invoke(chin, new SteelAxe());
System.out.println(chin.getAxe());
}
// 调用setter和getter方法
System.out.println("模拟setter和getter方法");
System.out.println("懒得写");
// 通过反射操作属性
System.out.println("通过反射操作属性");
// 得到一个对象中属性的具体内容
System.out.println("得到一个对象中属性的具体内容");
Chinese ch1 = (Chinese) clazzChinese.newInstance();
Field commonPro1 = clazzChinese.getDeclaredField("commonPro");
// commonPro1.setAccessible(true);
commonPro1.set(ch1, "lime");
commonPro1.get(ch1);
System.out.println(ch1.getCommonPro());
System.out.println("-----------通过反射操作数组--------------");
System.out.println("-----------Array类的常用方法------------");
// 根据下标取得数组内容
System.out.println("根据下标取得数组内容");
int[] temp = {1,2,3};
Class<?> c = temp.getClass().getComponentType();
System.out.println("类型:" + c.getName());
System.out.println("长度:" + Array.getLength(temp));
System.out.println("第一个内容:" + Array.get(temp,0));
// 修改指定位置的内容
System.out.println("修改指定位置的内容");
Array.set(temp, 0, 6);
System.out.println("第一个内容:" + Array.get(temp,0));
// 根据已有的数组类型开辟新的数组对象
System.out.println("根据已有的数组类型开辟新的数组对象");
int[] newTemp = (int[]) Array.newInstance(temp.getClass().getComponentType(), Array.getLength(temp)*2);
System.arraycopy(temp, 0, newTemp, 0, temp.length);
for(int array : newTemp){
System.err.print(array);
}
System.out.println();
System.out.println(Array.getLength(newTemp));
for(int i = 0;i < Array.getLength(newTemp);i++){
System.out.print(Array.get(newTemp, i));
}
System.out.println("--------------------------------");
}
}
动态代理
通过一个代理类完成全部的代理功能,那么此时就必须使用动态代理完成。
在Java中想实现动态代理机制,则需要java.lang.reflect.InvocationHandler接口和java.lang.reflect.Proxy类的支持。
InvocationHandler接口的定义如下:
/*
* proxy : (此处有误吧?被代理的对象)应该是指最终生成的代理对象,打印出来是class $proxy0
* method : 要调用的方法
* args[] : 方法调用时所需要的参数。
*/
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable;
Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类。
Proxy类提供了如下的操作方法:
// 通过newProxyInstance()方法可以动态地生成实现类
/*
* loader : 类加载器。Proxy.class.getClassLoader().getClass().getName();
* interfaces : 得到全部的接口。
* hander : 得到Invocationhandler接口的子类实例。
*/
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler handler) throws lllegalArgumentException{ }
Class : MyInvocationHandler
package edu.pri.lime._7_8_3.demo.bean; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class MyInvocationHandler implements InvocationHandler{ // 真实主题
private Object obj;
// 绑定真实操作主题
public Object bind(Object obj){
this.obj = obj;
// Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类。
// 通过Proxy.newProxyInstance()可以动态地生成实现类
// 取得代理对象
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
} // 动态调用方法
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// 调用方法,传入真实主题和参数
args[0] = "Oracle";
Object temp = method.invoke(this.obj, args);
// 返回方法的返回信息
return temp;
} }
Interface : Subject
package edu.pri.lime._7_8_3.demo.bean; //定义Subject接口
public interface Subject {
// 定义抽象方法say
public String say(String name,int age);
}
Class : RealSubject
package edu.pri.lime._7_8_3.demo.bean.impl; import edu.pri.lime._7_8_3.demo.bean.Subject; //定义真实主题实现类
//在操作时直接将真实主题类的对象传入到MyInvocationHandler类的bind()方法中即可
public class RealSubject implements Subject { public String say(String name, int age) {
return "姓名:" + name + ", 年龄:" + age;
} }
Class : DynaProxyDemo
package edu.pri.lime._7_8_3.demo.main; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; import edu.pri.lime._7_8_3.demo.bean.MyInvocationHandler;
import edu.pri.lime._7_8_3.demo.bean.Subject;
import edu.pri.lime._7_8_3.demo.bean.impl.RealSubject; public class DynaProxyDemo { public static void main(String[] args) {
{
// 实例化代理操作类
MyInvocationHandler handler = new MyInvocationHandler();
// 绑定对象
Subject sub = (Subject) handler.bind(new RealSubject());
// 通过动态代理调用方法
String info = sub.say("lime", 20);
System.out.println(info);
}
}
}
Console :
姓名:Oracle, 年龄:20
啦啦啦
啦啦啦
java.lang.Class<T> -- 反射机制及动态代理的更多相关文章
- java反射机制与动态代理
在学习HadoopRPC时.用到了函数调用.函数调用都是採用的java的反射机制和动态代理来实现的,所以如今回想下java的反射和动态代理的相关知识. 一.反射 JAVA反射机制定义: JAVA反射机 ...
- Java中的反射机制和动态代理
一.反射概述 反射机制指的是Java在运行时候有一种自观的能力,能够了解自身的情况为下一步做准备,其想表达的意思就是:在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法:对于任意一个对象 ...
- Java反射机制以及动态代理
Java反射机制以及动态代理 Java反射机制 含义与功能 Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类 ...
- java学习笔记13--反射机制与动态代理
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...
- 【Java基础】java中的反射机制与动态代理
一.java中的反射机制 java反射的官方定义:在运行状态下,可以获取任意一个类的所有属性和方法,并且可通过某类任意一对象实例调用该类的所有方法.这种动态获取类的信息及动态调用类中方法的功能称为ja ...
- java.lang.Class<T> -- 反射机制
1反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...
- Java的反射机制和动态代理
介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大的功能,可以原 ...
- Java技术整理1---反射机制及动态代理详解
1.反射是指在程序运行过程中动态获取类的相关信息,包括类是通过哪个加载器进行加载,类的方法和成员变量.构造方法等. 如下示例可以通过三种方法根据类的实例来获取该类的相关信息 public static ...
- Java 核心类库之反射机制
1:什么是反射机制? 2:反射机制它可以做什么呢? 3:反射机制对应的API又是什么? 1):通过反射机制来获取一个对象的全限定名称(完整包名),和类名: 2):实例化Class对象 3):获取对象的 ...
随机推荐
- Android7.0 Doze模式分析(一)Doze介绍 & DeviceIdleController
參考:http://blog.csdn.net/gaugamela/article/details/52981984 在Android M中.Google就引入了Doze模式.它定义了一种全新的 ...
- 【驱动】——seq_file使用指南
seq_file只是在普通的文件read中加入了内核缓冲的功能,从而实现顺序多次遍历,读取大数据量的简单接口.seq_file一般只提供只读接口,在使用seq_file操作时,主要靠下述四个操作来完成 ...
- git设置HTTP代理
git设置HTTP代理 设置HTTP代理 如果公司使用代理,git就需要设置代理才能克隆远程仓库 执行下面两条语句 git config --global http.proxy 10.167.32.1 ...
- 常用的HTTP协议状态码
200 - OK,服务器成功返回网页 - Standard response for successful HTTP requests. 301 - Moved Permanently(永久跳 ...
- Python 文件操作一
#-*- coding:utf-8 -*- #文件操作 #open()函数格式 #open(文件名,访问模式) f = open('1.md',"r") #read()没有不传参数 ...
- JSON的简单介绍以及C语言的JSON库使用
JSON概述 JSON: JavaScript 对象表示法( JavaScript Object Notation) .是一种轻量级的数据交换格式. 它基于ECMAScript的一个子集. JSON采 ...
- 自然语言交流系统 phxnet团队 创新实训 个人博客 (十三)
关于java socket的一些总结: Java Socket通信有很多的时候需要我们不断的学习.方面效率虽然不及C与C++但它以灵活语言优势,为大家广为使用. 本文就对在使用java做通信方面程序时 ...
- linux下查看目录下某种文件类型累计的代码行数
find 路径 -name '*.py' | xargs wc -l
- 在Unity场景中更改天空盒的步骤
一.介绍 目的:在Unity场景中制作一个天空盒. 软件环境:Unity 2017.3.0f3,VS2013. 参考 skybox 二.自制一个天空盒 1,创建一个材质material 2,更改属性为 ...
- SQL Server 定时执行SQL语句的方法
SQL SERVER 定时任务,你可以启动一下.不过要想更加直观的控制,直接写一个程序,定时执行你的存储过程. 1.设置“SQL Server 代理”(SQL Server Agent)服务随系统启动 ...