Java中反射机制一
2017-08-28 22:16
411 查看
Java中反射机制
定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。
反射原理:
java反射机制是围绕Class类展开的,在深入java反射原理之前,需要对类加载机制有一个大致的了解。jvm使用ClassLoader将字节码文件(class文件)加载到方法区内存中,如下代码:
Class clazz = ClassLoader.getSystemClassLoader().loadClass("com.package.MyClass");
可见ClassLoader根据类的完全限定名加载类并返回了一个Class对象,而java反射的所有起源都是从这个class类开始的。
可以参考反射详解——>http://www.cnblogs.com/hongxinlaoking/p/4684652.html
反射作用:
在运行时判断任意一个对象所属的类;
在运行时获取类的对象;
在运行时访问java对象的属性,方法,构造方法等。
反射字节码对象方式:
1、对象名.getClass 例如: person.getClass();
2、类名.clss 例: Class clazz = Person.class
3、Class.forName("包名.类名") 例:Class.forName("com.reflection.MyClass");
反射实例:
下面介绍利用反射来获取一个类的所有方法:
package com.itheima.reflect; import java.lang.reflect.*; import java.util.Scanner; public class ReflectionTest { public static void main(String[] args) { //从命令行参数或用户输入中读取的类名 String name; Scanner input = new Scanner(System.in); System.out.println("输入类名(例如java.util.Date):"); name = input.next(); try { //打印类名和父名(if != Object) Class c1 = Class.forName(name); Class superc1 = c1.getSuperclass(); String modifiers = Modifier.toString(c1.getModifiers());//将修饰符打印出来 if(modifiers.length()>0) System.out.print(modifiers); System.out.print(" class "+name); if(superc1 != null && superc1 != Object.class) System.out.print(" extends "+ superc1.getName()); System.out.print("\n{\n"); printConstructors(c1); System.out.println(); printMethods(c1); System.out.println(); printFields(c1); System.out.println("}"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * 打印一个类的所有构造函数 * @param c1 a class */ public static void printConstructors(Class c1){ Constructor[] constructors = c1.getDeclaredConstructors(); for (Constructor c : constructors) { String name = c.getName(); System.out.print(" "); String modifiers = Modifier.toString(c.getModifiers()); if(modifiers.length()>0) System.out.print(modifiers + " "); System.out.print(name + "("); //打印参数类型 Class[] paramTypes = c.getParameterTypes(); for (int i = 0; i < paramTypes.length; i++) { if(i > 0)System.out.print(", "); System.out.print(paramTypes[i].getName()); } System.out.println(");"); } } /** * 打印类的所有方法 * @param c1 a class */ public static void printMethods(Class c1){ Method[] methods = c1.getDeclaredMethods(); for (Method m : methods) { Class retType = m.getReturnType(); String name = m.getName(); System.out.print(" "); //打印修饰符,返回类型和方法名 String modifiers = Modifier.toString(m.getModifiers()); if(modifiers.length()>0) System.out.print(modifiers + " "); System.out.print(retType.getName() + " " + name + "("); //打印参数类型 Class[] paramTypes = m.getParameterTypes(); for (int i = 0; i < paramTypes.length; i++) { if(i > 0)System.out.print(", "); System.out.print(paramTypes[i].getName()); } System.out.println(");"); } } /** * 打印类的所有字段 * @param c1 a class */ public static void printFields(Class c1){ Field[] fields = c1.getDeclaredFields(); for (Field f : fields) { System.out.print(" "); Class type = f.getType(); String name = f.getName(); String modifier = Modifier.toString(f.getModifiers()); if(modifier.length()>0)System.out.print(modifier + " "); System.out.println(type + " " + name +";"); } } }
相关文章推荐
- JAVA的反射机制
- java 反射机制
- Java 反射机制的实例详解
- java 反射机制
- JAVA中的反射机制详解
- Java_反射机制
- JAVA中的反射机制
- java.lang.Class<T> -- 反射机制及动态代理
- java 反射机制
- 先码后看 Class对象(Java类型信息)与反射机制,超详细 侵立删
- 浅说Java中的反射机制(二)
- JAVA学习第六十四课 — 反射机制
- Java的反射机制
- Java为什么支持反射机制?
- JAVA中的反射机制
- Java学习之反射机制
- java的RTTI与反射机制的区别和联系
- java 反射机制 观点
- java的反射机制(含数组参数)
- Java通过反射机制动态设置对象属性值的方法