java反射机制
来源:互联网 发布:淘宝红灯牌收音机735b 编辑:程序博客网 时间:2024/06/08 19:16
引言:最近无意中在项目中看到了使用反射机制的代码,好奇心顿起,于是在网上找了些资料学习了下...
反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力。通过这种能力可以彻底的了解自身的情况为下一步的动作做准备。
Java的反射机制的实现要借助于4个类:class,Constructor,Field,Method;其中class代表的时类对 象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象。通过这四个对象我们可以粗略的看到一个类的各个组成部分。
Java反射机制主要提供了以下功能:在运行时判定任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判定任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。hibernate的延迟载入,spring的AOP都是这么实现的.
下面我们来看看具体的代码实现:
实体类:Simple
package test;public class Simple {public String a = "zwm";protected int m = 2;private int i = 1;public Simple(){ } public Simple(String s){ this.a=s; }protected void print(String str, int i) {System.out.println(i + "--测试---" + str);}private void print1(String str ) {System.out.println("测试---" + str);}}
测试类:testFs
package test;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class testFs {public static void main(String[] args) throws ClassNotFoundException,SecurityException, NoSuchMethodException, InstantiationException,IllegalAccessException, IllegalArgumentException,InvocationTargetException, NoSuchFieldException {Class<?> simpleClass = Class.forName("test.Simple");Object simpelObject = simpleClass.newInstance();//getFields()、getDeclaredFields(),它们分别是用来获取反射类中所有公有//属性和反射类中所有的属性的方法Field[] fields=simpleClass.getFields();//获取反射类中所有公有属性System.out.println("获取反射类中所有公有属性:");System.out.println("fields.length====>"+fields.length);for (int i = 0; i < fields.length; i++) {Class<?> cl=fields[i].getType();System.out.println("cl===>"+cl);}Field[] fields1=simpleClass.getDeclaredFields();//获取反射类中所有的属性System.out.println("获取反射类中所有的属性:");System.out.println("fields1.length====>"+fields1.length);for (int i = 0; i < fields1.length; i++) {Class<?> cl1=fields1[i].getType();System.out.println("cl1===>"+cl1);}Field f = simpleClass.getDeclaredField("i");//获取反射类中私有的属性//setAccessible方法,它是用来设置是否有权限访问反射类中的私有属性的,只有设置为true时才可以访问,默认为falsef.setAccessible(true); Integer i = (Integer)f.get(new Simple());System.out.println("获取反射类中私有的属:"); System.out.println("i====>"+i); String className = simpleClass.getName(); //获取指定类的类名 Constructor[] constructors = simpleClass.getConstructors();//获取指定类的构造方法 System.out.println("获取指定类的构造方法:"); for ( int m= 0 ; m<constructors.length; m++) { Class[] parameterTypes = constructors[m].getParameterTypes();//获取指定构造方法的参数的集合 System.out.print(className + "(" ); for ( int j= 0 ; j<parameterTypes.length; j++) System.out.print(parameterTypes[j].getName() + " " ); System.out.println(")" ); } Method[] Methods= simpleClass.getDeclaredMethods(); System.out.println("获取指定类的所有方法"); for (int j = 0; j < Methods.length; j++) { //输出方法的返回类型 System.out.print(Methods[j].getReturnType().getName()); //输出方法名 System.out.print(" " +Methods[j].getName()+ "(" ); //获取方法的参数 Class[] parameterTypes = Methods[j].getParameterTypes(); for ( int k= 0 ; k<parameterTypes.length; k++){ System.out.print(parameterTypes[k].getName()); if (parameterTypes.length>k+ 1 ){ System.out.print("," ); } } System.out.println(")" ); } Class[] args1 = new Class[2];args1[0] = String.class;//对应方法的参数类型args1[1] = int.class;//对应方法的参数类型Method simpleMethod = simpleClass.getDeclaredMethod("print",args1);Object[] argments = new Object[2];//参数值argments[0] = "Hello,Reflection!!!";argments[1] = 2;simpleMethod.invoke(simpelObject, argments);//方法调用Class[] args2 = new Class[1];args2[0] = String.class;//对应方法的参数类型Method simpleMethod1 = simpleClass.getDeclaredMethod("print1",args2);//setAccessible方法,它是用来设置是否有权限访问反射类中的私有方法的,只有设置为true时才可以访问,默认为false simpleMethod1.setAccessible(true); String[] argments1 = new String[1];//参数值argments1[0] = "Hello,Reflection!!!";simpleMethod1.invoke(simpelObject, argments1);//方法调用}}
输出结果:
获取反射类中所有公有属性:fields.length====>1cl===>class java.lang.String获取反射类中所有的属性:fields1.length====>3cl1===>class java.lang.Stringcl1===>intcl1===>int获取反射类中私有的属:i====>1获取指定类的构造方法:test.Simple()test.Simple(java.lang.String )获取指定类的所有方法void print1(java.lang.String)void print(java.lang.String,int)2--测试---Hello,Reflection!!!测试---Hello,Reflection!!!
初次接触java的反射机制,理解的不是很深,有不对的地方还望各位不惜赐教!!!
9 0
- 【反射】JAVA反射机制
- 【Java】JAVA反射机制
- Java 反射机制[Field反射]
- Java 反射机制[Method反射]
- Java反射机制笔记-反射机制
- java的反射机制
- Java的反射机制
- java反射机制详解!
- Java反射机制
- Java的反射机制
- java 反射机制--侯捷
- java反射机制
- java反射机制
- [候捷]Java反射机制
- java 反射机制
- java 反射机制初探
- 关于Java反射机制
- java反射机制
- android jni 调试
- 程序流程控制
- html语言剖析十六 调色原理
- 2014,跟着威哥学Java
- MSComm控件注册——exe文件打不开
- java反射机制
- nullptr
- 串口驱动移植心得
- Python 核心编程笔记 第七章 序列(映射&集合)
- 采用DIV+CSS布局的好处
- System.UnauthorizedAccessException: 拒绝访问临时目录。以其运行 XmlSerializer 的身份“IIS APPPOOL\DefaultAppPool”没有足够的
- 无法向会话状态服务器发出会话状态请求
- HDU 1165(递推)
- [Mugeda HTML5技术教程之2] Mugeda HTML5富媒体平台简介