java反射

什么是反射机制 
        简单的来说,反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。

反射机制的优缺点:

优点:反射提高了程序的灵活性和扩展性,降低耦合性,提高自适应能力。它允许程序创建和控制任何类的对象,无需提前硬编码目标类;
缺点:(1)性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用。
      (2)使用反射会模糊程序内内部逻辑:程序员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂。


首先创建反射解析类的测试类,代码如下:

package com.eric.ykk.study;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class ReflectionStudy {
		
	public static void main(String []args){
		
		Class reflection = null;
		
		try {
			 /**  
	         * 获取Class对象 
	         * @see 加载以字符串形式给出的含完整包名的类名所对应的类   输入一个包含包名的完整的类路径
	         * @see 加载类之后,会自动创建并返回一个Class类型的对象,它所描述的就是指定类的信息 
	         * 	获取Class对象的其他两种方式
	         *  Class reflection = String.class;
			 *  Class reflection = new String().getClass();
	         */  
				reflection = Class.forName("java.lang.String");
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		/**
		 * 解析当前加载类的方法
		 * 该方法只能获取到当前声明类封装的方法信息   不包括其父类的方法
		 * Method []methods = reflection.getMethods();//该方法可以获取到父类的方法
		 */
		Method []methods = reflection.getDeclaredMethods();
		System.out.println("------解析方法开始------");
		for(Method method:methods){
			System.out.println(method.getName()+"方法信息开始----");
			System.out.println(method.toString());
			//方法名
			System.out.println("方法名:"+method.getName());
			//返回该方法的访问控制修饰符
			System.out.println("方法访问控制修饰符:"+Modifier.toString(method.getModifiers()));
			System.out.println("方法返回值类型:"+method.getReturnType());
			System.out.println("方法的参数列表:");
			Class []parameters = method.getParameterTypes();
			for(int i=0;i<parameters.length;i++){
				Class parameter = parameters[i];
				if(i!=0){
					System.out.print(",");
				}
				System.out.print(parameter.toString());
			}
			System.out.println(method.getName()+"方法信息结束-----");
		}
		System.out.println("------解析方法结束------");
		
		/**
		 * 解析当前加载类的属性
		 * 该方法只可以获取到当前声明类所包含的属性信息  不包含父类
		 * Field []fields = reflection.getFields(); 获得子类以及父类中的成员信息
		 */ 
		Field []fields = reflection.getDeclaredFields();
		System.out.println("------解析属性开始------");
		for(Field field:fields){
			System.out.println(field.getName()+"属性信息----");
			System.out.println(field.toString());
			//属性名
			System.out.println(field.getName());
			//属性类型
			System.out.println(field.getType());
			//属性修饰符
			System.out.println(Modifier.toString(field.getModifiers()));
		}
		System.out.println("------解析属性结束------");
		
		/**
		 * 解析加载类的构造方法
		 */
		Constructor [] construtors = reflection.getDeclaredConstructors();
		System.out.println("------解析构造方法开始------");
		for(Constructor constructor:construtors){
			System.out.println("构造方法名:"+constructor.getName());
			System.out.println("构造方法访问控制修饰符:"+Modifier.toString(constructor.getModifiers()));
			System.out.print("构造方法参数列表:");
			
			Class []parameters = constructor.getParameterTypes();
			for(int i=0;i<parameters.length;i++){
				if(i!=0){
					System.out.print(",");
				}
				Class parameter = parameters[i];
				System.out.print(parameter);
			}
		}
		System.out.println("------解析构造方法结束------");
		/**
		 * 解析加载类的实现的接口
		 */
		Class interfaces[] = reflection.getInterfaces();
		System.out.println("------解析实现接口开始------");
		for(Class interfaceOne:interfaces){
			System.out.println(interfaceOne.toString());
		}
		System.out.println("------解析实现接口结束------");
		/**
		 * 解析加载类的父类
		 */
		Class parentClass = reflection.getSuperclass();
		System.out.println("------解析父类开始------");
		System.out.println(parentClass.toString());
		System.out.println("------解析父类结束------");
		
	}
		
}

解析类代码结束,下面是部分的运行结果:

------解析方法开始------
exit方法信息开始----
public static void java.lang.System.exit(int)
方法名:exit
方法访问控制修饰符:public static
方法返回值类型:void
方法的参数列表:
intexit方法信息结束-----
runFinalizersOnExit方法信息开始----
public static void java.lang.System.runFinalizersOnExit(boolean)
方法名:runFinalizersOnExit
方法访问控制修饰符:public static
方法返回值类型:void
方法的参数列表:
booleanrunFinalizersOnExit方法信息结束-----
initializeSystemClass方法信息开始----
private static void java.lang.System.initializeSystemClass()
方法名:initializeSystemClass
方法访问控制修饰符:private static
方法返回值类型:void
方法的参数列表:
initializeSystemClass方法信息结束-----
setProperty方法信息开始----
public static java.lang.String java.lang.System.setProperty(java.lang.String,java.lang.String)
方法名:setProperty
方法访问控制修饰符:public static
方法返回值类型:class java.lang.String
方法的参数列表:
class java.lang.String,class java.lang.StringsetProperty方法信息结束-----
getProperty方法信息开始----
public static java.lang.String java.lang.System.getProperty(java.lang.String)
方法名:getProperty
方法访问控制修饰符:public static
方法返回值类型:class java.lang.String
方法的参数列表:
class java.lang.StringgetProperty方法信息结束-----
getProperty方法信息开始----
public static java.lang.String java.lang.System.getProperty(java.lang.String,java.lang.String)
方法名:getProperty
方法访问控制修饰符:public static
方法返回值类型:class java.lang.String
方法的参数列表:
class java.lang.String,class java.lang.StringgetProperty方法信息结束-----
identityHashCode方法信息开始----
public static native int java.lang.System.identityHashCode(java.lang.Object)
方法名:identityHashCode
方法访问控制修饰符:public static native
方法返回值类型:int
方法的参数列表:
class java.lang.ObjectidentityHashCode方法信息结束-----
currentTimeMillis方法信息开始----
public static native long java.lang.System.currentTimeMillis()
方法名:currentTimeMillis
方法访问控制修饰符:public static native
方法返回值类型:long
方法的参数列表:
currentTimeMillis方法信息结束-----
nanoTime方法信息开始----
public static native long java.lang.System.nanoTime()
方法名:nanoTime
方法访问控制修饰符:public static native
方法返回值类型:long
方法的参数列表:
nanoTime方法信息结束-----
arraycopy方法信息开始----
public static native void java.lang.System.arraycopy(java.lang.Object,int,java.lang.Object,int,int)
方法名:arraycopy
方法访问控制修饰符:public static native
方法返回值类型:void
方法的参数列表:
class java.lang.Object,int,class java.lang.Object,int,intarraycopy方法信息结束-----
getCallerClass方法信息开始----
static java.lang.Class java.lang.System.getCallerClass()
方法名:getCallerClass
方法访问控制修饰符:static
方法返回值类型:class java.lang.Class
方法的参数列表:
getCallerClass方法信息结束-----
registerNatives方法信息开始----
private static native void java.lang.System.registerNatives()
方法名:registerNatives
方法访问控制修饰符:private static native
方法返回值类型:void
方法的参数列表:
registerNatives方法信息结束-----
getSecurityManager方法信息开始----
public static java.lang.SecurityManager java.lang.System.getSecurityManager()
方法名:getSecurityManager
方法访问控制修饰符:public static
方法返回值类型:class java.lang.SecurityManager
方法的参数列表:
getSecurityManager方法信息结束-----
load方法信息开始----
public static void java.lang.System.load(java.lang.String)
方法名:load
方法访问控制修饰符:public static
方法返回值类型:void
方法的参数列表:
class java.lang.Stringload方法信息结束-----
loadLibrary方法信息开始----
public static void java.lang.System.loadLibrary(java.lang.String)
方法名:loadLibrary
方法访问控制修饰符:public static
方法返回值类型:void
方法的参数列表:
class java.lang.StringloadLibrary方法信息结束-----
mapLibraryName方法信息开始----
public static native java.lang.String java.lang.System.mapLibraryName(java.lang.String)
方法名:mapLibraryName
方法访问控制修饰符:public static native
方法返回值类型:class java.lang.String
方法的参数列表:
class java.lang.StringmapLibraryName方法信息结束-----
checkIO方法信息开始----
private static void java.lang.System.checkIO()
方法名:checkIO
方法访问控制修饰符:private static
方法返回值类型:void
方法的参数列表:
checkIO方法信息结束-----
checkKey方法信息开始----
private static void java.lang.System.checkKey(java.lang.String)
方法名:checkKey
方法访问控制修饰符:private static
方法返回值类型:void
方法的参数列表:
class java.lang.StringcheckKey方法信息结束-----
clearProperty方法信息开始----
public static java.lang.String java.lang.System.clearProperty(java.lang.String)
方法名:clearProperty
方法访问控制修饰符:public static
方法返回值类型:class java.lang.String
方法的参数列表:
class java.lang.StringclearProperty方法信息结束-----
console方法信息开始----
public static java.io.Console java.lang.System.console()
方法名:console
方法访问控制修饰符:public static
方法返回值类型:class java.io.Console
方法的参数列表:
console方法信息结束-----
gc方法信息开始----
public static void java.lang.System.gc()
方法名:gc
方法访问控制修饰符:public static
方法返回值类型:void
方法的参数列表:
gc方法信息结束-----
getProperties方法信息开始----
public static java.util.Properties java.lang.System.getProperties()
方法名:getProperties
方法访问控制修饰符:public static
方法返回值类型:class java.util.Properties
方法的参数列表:
getProperties方法信息结束-----
getenv方法信息开始----
public static java.lang.String java.lang.System.getenv(java.lang.String)
方法名:getenv
方法访问控制修饰符:public static
方法返回值类型:class java.lang.String
方法的参数列表:
class java.lang.Stringgetenv方法信息结束-----
getenv方法信息开始----
public static java.util.Map java.lang.System.getenv()
方法名:getenv
方法访问控制修饰符:public static
方法返回值类型:interface java.util.Map
方法的参数列表:
getenv方法信息结束-----
inheritedChannel方法信息开始----
public static java.nio.channels.Channel java.lang.System.inheritedChannel() throws java.io.IOException
方法名:inheritedChannel
方法访问控制修饰符:public static
方法返回值类型:interface java.nio.channels.Channel
方法的参数列表:
inheritedChannel方法信息结束-----
initProperties方法信息开始----
private static native java.util.Properties java.lang.System.initProperties(java.util.Properties)
方法名:initProperties
方法访问控制修饰符:private static native
方法返回值类型:class java.util.Properties
方法的参数列表:
class java.util.PropertiesinitProperties方法信息结束-----
nullInputStream方法信息开始----
private static java.io.InputStream java.lang.System.nullInputStream() throws java.lang.NullPointerException
方法名:nullInputStream
方法访问控制修饰符:private static
方法返回值类型:class java.io.InputStream
方法的参数列表:
nullInputStream方法信息结束-----
nullPrintStream方法信息开始----
private static java.io.PrintStream java.lang.System.nullPrintStream() throws java.lang.NullPointerException
方法名:nullPrintStream
方法访问控制修饰符:private static
方法返回值类型:class java.io.PrintStream
方法的参数列表:
nullPrintStream方法信息结束-----
runFinalization方法信息开始----
public static void java.lang.System.runFinalization()
方法名:runFinalization
方法访问控制修饰符:public static
方法返回值类型:void
方法的参数列表:
runFinalization方法信息结束-----
setErr方法信息开始----
public static void java.lang.System.setErr(java.io.PrintStream)
方法名:setErr
方法访问控制修饰符:public static
方法返回值类型:void
方法的参数列表:
class java.io.PrintStreamsetErr方法信息结束-----
setErr0方法信息开始----
private static native void java.lang.System.setErr0(java.io.PrintStream)
方法名:setErr0
方法访问控制修饰符:private static native
方法返回值类型:void
方法的参数列表:
class java.io.PrintStreamsetErr0方法信息结束-----
setIn方法信息开始----
public static void java.lang.System.setIn(java.io.InputStream)
方法名:setIn
方法访问控制修饰符:public static
方法返回值类型:void
方法的参数列表:
class java.io.InputStreamsetIn方法信息结束-----
setIn0方法信息开始----
private static native void java.lang.System.setIn0(java.io.InputStream)
方法名:setIn0
方法访问控制修饰符:private static native
方法返回值类型:void
方法的参数列表:
class java.io.InputStreamsetIn0方法信息结束-----
setJavaLangAccess方法信息开始----
private static void java.lang.System.setJavaLangAccess()
方法名:setJavaLangAccess
方法访问控制修饰符:private static
方法返回值类型:void
方法的参数列表:
setJavaLangAccess方法信息结束-----
setOut方法信息开始----
public static void java.lang.System.setOut(java.io.PrintStream)
方法名:setOut
方法访问控制修饰符:public static
方法返回值类型:void
方法的参数列表:
class java.io.PrintStreamsetOut方法信息结束-----
setOut0方法信息开始----
private static native void java.lang.System.setOut0(java.io.PrintStream)
方法名:setOut0
方法访问控制修饰符:private static native
方法返回值类型:void
方法的参数列表:
class java.io.PrintStreamsetOut0方法信息结束-----
setProperties方法信息开始----
public static void java.lang.System.setProperties(java.util.Properties)
方法名:setProperties
方法访问控制修饰符:public static
方法返回值类型:void
方法的参数列表:
class java.util.PropertiessetProperties方法信息结束-----
setSecurityManager方法信息开始----
public static void java.lang.System.setSecurityManager(java.lang.SecurityManager)
方法名:setSecurityManager
方法访问控制修饰符:public static
方法返回值类型:void
方法的参数列表:
class java.lang.SecurityManagersetSecurityManager方法信息结束-----
setSecurityManager0方法信息开始----
private static synchronized void java.lang.System.setSecurityManager0(java.lang.SecurityManager)
方法名:setSecurityManager0
方法访问控制修饰符:private static synchronized
方法返回值类型:void
方法的参数列表:
class java.lang.SecurityManagersetSecurityManager0方法信息结束-----
------解析方法结束------
------解析属性开始------
in属性信息----
public static final java.io.InputStream java.lang.System.in
in
class java.io.InputStream
public static final
out属性信息----
public static final java.io.PrintStream java.lang.System.out
out
class java.io.PrintStream
public static final
err属性信息----
public static final java.io.PrintStream java.lang.System.err
err
class java.io.PrintStream
public static final
security属性信息----
private static volatile java.lang.SecurityManager java.lang.System.security
security
class java.lang.SecurityManager
private static volatile
cons属性信息----
private static volatile java.io.Console java.lang.System.cons
cons
class java.io.Console
private static volatile
props属性信息----
private static java.util.Properties java.lang.System.props
props
class java.util.Properties
private static
------解析属性结束------
------解析构造方法开始------
构造方法名:java.lang.System
构造方法访问控制修饰符:private
构造方法参数列表:------解析构造方法结束------
------解析实现接口开始------
------解析实现接口结束------
------解析父类开始------
class java.lang.Object
------解析父类结束------


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值