java学习之反射机制
2010-04-21 00:53
483 查看
什么是反射
java程序可以在运行期间动态的加载、解析和使用一些在编译阶段并不确定的类型,这一机制被称为“反射(reflection)”或者“内省(introspection)”.
反射机制提供的功能
1,加载运行时才能确定的类型
2,解析类的结构、获取其内部信息
3,操作该类型或其实例
1》访问属性
2》调用方法
3》创建新对象
java.lang.class 类
class类的实例用于表示运行时的JAVA数据类型,包括类、接口、数组、枚举、注解和基本数据类型
在类加载时, Java虚拟机会自动创建相应的class对象
java.lang.reflect包
1,java.lang.reflect.fleld
2,java.lang.reflect.Method
3,java.lang.reflect.Costructor
4,java.lang.reflect.Modifer
5,java.lang.reflect.Array
使用反机制的基本步骤
获取目标类型相应的class对象
调用Class对象内省方法获取目标类成员信息
访问目标类方法信息/操作目标类成员
例一
例二
获取CLASS对象
针对引用数据类型
调用静态方法Class.ForName(String (class 全称包括包名))
调用Object类中定义的getClass()方法
使用.class 表达式
例:class c1 = String.class;
class c2 = Person.class;
java程序可以在运行期间动态的加载、解析和使用一些在编译阶段并不确定的类型,这一机制被称为“反射(reflection)”或者“内省(introspection)”.
反射机制提供的功能
1,加载运行时才能确定的类型
2,解析类的结构、获取其内部信息
3,操作该类型或其实例
1》访问属性
2》调用方法
3》创建新对象
java.lang.class 类
class类的实例用于表示运行时的JAVA数据类型,包括类、接口、数组、枚举、注解和基本数据类型
在类加载时, Java虚拟机会自动创建相应的class对象
java.lang.reflect包
1,java.lang.reflect.fleld
2,java.lang.reflect.Method
3,java.lang.reflect.Costructor
4,java.lang.reflect.Modifer
5,java.lang.reflect.Array
使用反机制的基本步骤
获取目标类型相应的class对象
调用Class对象内省方法获取目标类成员信息
访问目标类方法信息/操作目标类成员
例一
package com.manager; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.Scanner; public class TestReflection01 { public static void main(String[] args) { System.out.println("input the type of the class"); Scanner scan = new Scanner(System.in); String className= scan.next(); System.out.println("current class name : " + className); try { //获取CLASS对象 Class c = Class.forName(className); //解析属性信息 Field[] fs = c.getFields(); for(Field f : fs){ System.out.println("-------------------------------"); System.out.println("属性:" + f.toString()); System.out.println("数据类型:" + f.getType()); System.out.println("属性名:" + f.getName()); int mod = f.getModifiers(); System.out.println("属性修饰符:" + Modifier.toString(mod)); System.out.println("-------------------------------"); } //解析方法信息t Method[] ms = c.getDeclaredMethods(); for(Method m : ms){ System.out.println("--------------------------------"); System.out.println("方法:" + m.toString()); System.out.println("方法名:" + m.getName()); int mod = m.getModifiers(); System.out.println("方法修饰符:" + Modifier.toString(mod)); System.out.println("方法参数列表"); Class pts[] = m.getParameterTypes(); for(int i = 0; i < pts.length; i++){ Class clazz = pts[i]; if(i != 0){ System.out.println(clazz); } } System.out.println(); System.out.println("返回值类型:" + m.getReturnType()); } //解析构造方法信息 Constructor[] cs = c.getConstructors(); for(Constructor con : cs){ System.out.println("----------------------------------"); System.out.println("构造方法:" + con.toString()); System.out.println("方法名:" + con.getName()); int mod = con.getModifiers(); System.out.println("方法修饰符:" + Modifier.toString(mod)); System.out.println("方法参数列表"); Class pts[] = con.getParameterTypes(); for(int i = 0; i < pts.length; i++){ Class clazz = pts[i]; if(i != 0){ System.out.println(clazz); } } System.out.println(); System.out.println("-----------------------------------"); } //解析当前类类型的父类 Class superClass = c.getSuperclass(); System.out.println("当前类的父类:" + superClass.toString()); System.out.println("-------------------"); //解析当前类实现的接口 Class[] interfaces = c.getInterfaces(); System.out.println("当前类所实现的接口"); for(Class class1 : interfaces){ System.out.println(class1.toString()); } //解析当前是类型所在包信息 Package p = c.getPackage(); System.out.println("当前类所在包:" + p.toString()); } catch (ClassNotFoundException e) { e.printStackTrace(); } //解析方法信息 } }
例二
package com.manager; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; class User{ public String name; public int age; public static int total = 100; User(){ super(); } User(String name, int age){ super(); this.name = name; this.age = age; } public void SetAll(String name, int age){ this.name = name; this.age = age; } public static void showAll(){ System.out.println("int static method showTotal , total = " + total); } public String toString(){ return "userName = " + name + "/t age = " + age; } } public class TestReflection02 { public static void main(String[] argss) { try{ User p1 = new User("张三", 18); TestReflection02 t = new TestReflection02(); System.out.println("------------------------------------------"); t.mf1(p1, "name" ,"李四"); t.mf1(p1, "age", 30); System.out.println(p1); System.out.println("------------------------------------------"); t.mf2("com.manager.User", "total", 88); System.out.println("------------------------------------------"); Class[]argTypes = new Class[]{String.class, int.class}; Object[] args = new Object[]{"王五", 99}; t.mf3(p1, "SetAll", argTypes, args); System.out.println(p1); System.out.println("------------------------------------------"); t.mf4("com.manager.User", "showAll", new Class[0], new Object[0]); }catch(Exception ex){ ex.printStackTrace(); } } public void mf1(Object o, String fieldName, Object newValue) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException { Class c = o.getClass(); Field f = c.getField(fieldName); Object fv = f.get(o); System.out.println("修改前:" + fieldName + "=" + fv); f.set(o, newValue); System.out.println("修改前:" + fieldName + "=" + f.get(o)); } public void mf2(String className, String fieldName, Object newValue) throws ClassNotFoundException, SecurityException, NoSuchFieldException, IllegalArgumentException,IllegalAccessException { Class c = Class.forName(className); Field f = c.getField(fieldName); Object fv = f.get(c); System.out.println("修改前:" + fieldName + "=" + fv); f.set(c, newValue); System.out.println("修改前:" + fieldName + "=" + f.get(c)); } public void mf3(Object o, String MethodName, Class[] argsType, Object[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException { Class c = o.getClass(); Method m = c.getMethod(MethodName, argsType); Object result = m.invoke(o, args); System.out.println("result : " + result); } public void mf4(String className, String MethodName, Class[] argsType, Object[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException { Class c = Class.forName(className); Method m = c.getMethod(MethodName, argsType); Object result = m.invoke(c, args); System.out.println("result : " + result); } }
获取CLASS对象
针对引用数据类型
调用静态方法Class.ForName(String (class 全称包括包名))
调用Object类中定义的getClass()方法
使用.class 表达式
例:class c1 = String.class;
class c2 = Person.class;
相关文章推荐
- java基础学习笔记——反射机制
- Java学习 反射机制(二)
- JAVA中的反射机制的学习
- 关于java反射机制的学习
- 《Spring 3.x 企业应用开发实战》学习笔记 第三章 IoC容器概述 3.2 相关Java基础知识 类装载器 反射机制
- JAVA基础学习(二十七)--反射机制
- java 反射机制-学习笔记(8)
- Java学习笔记之反射机制
- java学习之反射机制
- 黑马程序员——java基础——反射机制的学习
- Java学习总结:反射机制
- java基础学习——反射机制与动态代理
- 深入浅出学习hibernate框架(三):java的反射机制
- Java学习笔记09--反射机制
- java 反射机制学习
- java学习笔记09--反射机制
- java 反射机制-学习笔记(6)
- java学习笔记---类型信息(type information)、反射机制与动态代理
- Java学习笔记之反射机制初探
- Java 反射机制-学习笔记