java基础知识(二)--反射机制

java反射机制是java很重要的一个特性,反射技术是架构框架的基础所在,灵活掌握反射机制,对大家以后学习框架技术有很大的帮助,最近我在研究部门老大写的框架,对这个有很深的感触,写一些对反射的理解,跟大家共同学习探讨

什么是反射机制?

反射机制是指程序在运行时,能够获取到自身的信息。在java中,只要指定了类名,就能够通过反射机制来获取到类的所有信息,对于任意的一个对象,都能够调用它的任意一个方法和属性,这种动态获取信息以及动态调用对象的方法的功能被称为java语言的反射机制。

java反射机制的用途

反射的主要作用是在运行时能够调用任意一个对象的方法,使用一个类所具有的方法和属性,判断任意一个对象所属的类,甚至,能够构造出任意一个类的对象,通过这个机制,能够做到类之间的完全解耦,伟大的开源框架Spring中最重要的能力:控制反转IoC,就是基于java的这个能力来实现的。

反射机制的优点和缺点

为什么要用到反射机制,直接创建对象不就完了吗,何必这么麻烦?这里涉及到动态编译和静态编译的概念,静态编译,在代码编译期间即确定对象类型,绑定对象;动态编译,在运行时确定类型并绑定对象,最大限度发挥java灵活性,体现了多态的应用,用以降低类之间的耦合性。一句话,反射机制的有点就是可以实现动态创建对象是编译,体现出很大的灵活性,特别是在大型软件的架构中,它的灵活性就体现的十分明显。

但是反射机制的缺点也是明显的,由于反射基本上是一种解释操作,我们可以告诉JVM我们希望做什么,并且它会满足我们的要求,但是这类操作总是慢于直接执行相同的操作。

反射机制的使用

废话不多说,前面都把java的反射机制吹的天花乱坠的,光说不练假把式,现在我们就结合着代码来看看,反射机制到底能做什么,是怎么实现的。首先,我们把反射主要用到的方法都列出来:

Class c = Class.forName("className") ; // 获得Class,注明:className必须为全名,也就是得包含包名,比如reflection.A

Object obj=cls.newInstance(); // 创建对象的实例,通过反射机制,我们只需要知道这个包路径+类名,即可获得这个对象的实例,相当强大有木有!我

// 们经常使用的Spring的核心能力控制反转IOC不就是基于这个来实现的吗

获得构造器的方法:

Constructor getConstructor(Class[] params)//根据指定参数获得public构造器

Constructor[] getConstructors()//获得public的所有构造器

Constructor getDeclaredConstructor(Class[] params)//根据指定参数获得public和非public的构造器

Constructor[] getDeclaredConstructors()//获得public的所有构造器

获得类方法的方法:

Method getMethod(String name, Class[] params),根据方法名,参数类型获得方法

Method[] getMethods()//获得所有的public方法

Method getDeclaredMethod(String name, Class[] params)//根据方法名和参数类型,获得public和非public的方法

Method[] getDeclaredMethods()//获得所以的public和非public方法

获取类中的属性的方法:

Field getField(String name)//根据变量名得到相应的public变量

Field[] getFields()//获得类中所以public的方法

Field getDeclaredField(String name)//根据方法名获得public和非public变量

Field[] getDeclaredFields()//获得类中所有的public和非public方法

比较常用的就这些,方法都介绍完了,写个程序测试下吧,不然怎么知道效果怎样,通过下面这个程序你会发现,我们能够通过反射机制取得一个类的全部框架:

package reflection;

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

class A
{
	int value;
	
	void init(int initValue)
	{
		value = initValue;
	}
	
	void print()
	{
		System.out.print("Testing the class A!");
	}
}

public class hello 
{
	public static void main(String[] args) 
	{
		Class<?> demo = null;
		try 
		{
			demo = Class.forName("reflection.A");
		} catch (Exception e)
		{
			e.printStackTrace();
		}
		System.out.println("===============本类属性========================");

		// 取得本类的全部属性
        Field[] field = demo.getDeclaredFields();
        for (int i = 0; i < field.length; i++) {
            // 权限修饰符
            int mo = field[i].getModifiers();
            String priv = Modifier.toString(mo);
            
            // 属性类型
            Class<?> type = field[i].getType();
            System.out.println(priv + " " + type.getName() + " "
                    + field[i].getName() + ";");
        }
        System.out.println("===============本类方法========================");
        
        // 通过Class获得所对应对象的方法
        Method[] methods = demo.getMethods();
        // 输出每个方法名
        for (Method method : methods) {
            System.out.println(method);
        }
        
        System.out.println("===============实现的接口或者父类的属性========================");
        
        // 取得实现的接口或者父类的属性
        Field[] filed1 = demo.getFields();
        for (int j = 0; j < filed1.length; j++) {
            // 权限修饰符
            int mo = filed1[j].getModifiers();
            String priv = Modifier.toString(mo);
            
            // 属性类型
            Class<?> type = filed1[j].getType();
            System.out.println(priv + " " + type.getName() + " "
                    + filed1[j].getName() + ";");
        }
	}
}

输出结果:

===============本类属性========================
 int value;
===============本类方法========================
public final native java.lang.Class java.lang.Object.getClass()
public native int java.lang.Object.hashCode()
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
===============实现的接口或者父类的属性========================


你可能感兴趣的:(java基础知识(二)--反射机制)