您的位置:首页 > 编程语言 > Java开发

Java基础之反射

2015-08-16 00:28 344 查看
概述

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

动态获取类中信息,就是java反射。可以理解为对类的解剖。

如果想要对指定名称的字节码文件进行加载并获取其中的内容并调用,这时就使用到了反射技术。

(1)类的加载及类加载器

(2)反射:

通过字节码文件对象,去使用成员变量,构造方法,成员方法

(3)反射的使用

A:通过反射获取构造方法并使用

代码:

import cn.itcast.bean.Person;

import java.lang.reflect.Constructor;

import java.lang.reflect.InvocationTargetException;

public class ReflectDemo

{

public static void main(String[] args) throws Exception {

createNewObject_1();

System.out.println("--------------------");

createNewObject_2();

}

public static void createNewObject_1() throws ClassNotFoundException,InstantiationException,IllegalAccessException {

//早期:new时候,先根据被new的类的名称找寻该类的字节码文件,并加载进内存,

//并创建该字节码文件对象,并接着创建该字节文件的对应的Person对象。

//Person p = new Person();

//现在:

String name = "cn.itcast.bean.Person";

//找寻该文件类文件,并加载进内存,并产生Class对象。

Class clazz = Class.forName(name);

//如何产生该类的对象呢?

Object obj = clazz.newInstance();//调用Person的空参构造函数

}

public static void createNewObject_2() throws ClassNotFoundException,InstantiationException,NoSuchMethodException,IllegalAccessException,InvocationTargetException {

//Person p = new Person("小强",39);

/*

* 当获取指定名称对应类中的所体现的对象时。

* 而该对象初始化不使用空参数构造函数该怎么办呢?

* 既然是通过指定的构造函数进行对象的初始化。

* 所以应该先获取到该构造函数,通过字节码文件对象即可完成。

* 该方法是:getConstructor(parameterTypes);

*/

String name = "cn.itcast.bean.Person";

//找寻该名称类文件,并加载进内存,并产生Class对象。

Class clazz = Class.forName(name);

//获取到了指定的构造函数对象

Constructor constructor = clazz.getConstructor(int.class,String.class);

//通过该构造器对象的newInstance方法进行对象的初始化。

Object obj = constructor.newInstance(38,"小明");

}

}

B:通过反射获取成员变量并使用

C:通过反射获取成员方法并使用

代码:

import cn.itcast.bean.Person;

import java.lang.reflect.Method;

import java.lang.reflect.Constructor;

public class ReflectDemo

{

public static void main(String[] args) throws Exception {

getMethodDemo_1();

System.out.println("---------------------------");

getMethodDemo_2();

System.out.println("---------------------------");

getMethodDemo_3();

}

/*

* 获取指定Class中的公共函数。

*/

public static void getMethodDemo_1() throws Exception {

Class clazz = Class.forName("cn.itcast.bean.Person");

Method[] methods = clazz.getMethods();//获取的都是公有的方

methods = clazz.getDeclaredMethods();//只获取本类中所有方法,包括私有。

for(Method method : methods){

System.out.println(method);

}

}

public static void getMethodDemo_2() throws Exception {

Class clazz = Class.forName("cn.itcast.bean.Person");

Method method = clazz.getMethod("show",null);//获取空参数一般方法

Object obj = clazz.newInstance();

Constructor constructor = clazz.getConstructor(int.class,String.class);

obj = constructor.newInstance(37,"小明");

method.invoke(obj,null);

}

public static void getMethodDemo_3() throws Exception {

Class clazz = Class.forName("cn.itcast.bean.Person");

Method method = clazz.getMethod("paramMethod",String.class,int.class);//获取空参数一般方法

Object obj = clazz.newInstance();

Constructor constructor = clazz.getConstructor();

obj = constructor.newInstance();

method.invoke(obj,"小强",89);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: