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

Java反射机制详解,简单粗暴易理解

2015-08-22 22:35 567 查看

Java的反射机制非常的重要,下面就由代码加注释用一个例子

来学习反射机制的应用

首先,创建一个Person,我们要完全扒光它里面的东西

package com.fs;
/*
 * 定义一个Person类
 */
public class Person {

	/*
	 * 定义公有成员     私有成员
	 * 定义构造方法
	 * 私有构造方法
	 * 公有成员方法
	 * 私有成员方法
	 */
	public String address;
	private int phone;
	
	public Person() {
		System.out.println("public person() 的构造方法");
	}
	public Person(String name) {
		System.out.println("public person(String name) 的构造方法2 " + name);
	}
	private Person(String name,int age) {
		System.out.println("private person(String name,int age) 的构造方法3 " + name + "," +age);
	}
	public void add(int num1,int num2){
		System.out.println("num1+num2="+(num1+num2));
	}
	
	private void name(String name) {
		System.out.println("name = "+name);
	}
	
	private int age(int age) {
		System.out.println("age = "+age);
		return age;
	}

	
}


定义一个Reflection类来进行反射

package com.fs;

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

/**
 * ---------- 下面用 funConstructor() 做实例-----------
	Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数,
	
	Constructor[] getConstructors() -- 获得类的所有公共构造函数
	
	Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构造函数(与接入级别无关)
	
	Constructor[] getDeclaredConstructors() -- 获得类的所有构造函数(与接入级别无关)
*/

/**
 * 	
 * ---------- 下面用 funMethod() 做实例-----------
	用于获得方法信息函数:
	
	Method getMethod(String name, Class[] params) -- 使用特定的参数类型,获得命名的公共方法
	
	Method[] getMethods() -- 获得类的所有公共方法 当然也包括它所实现接口的方法
	
	Method getDeclaredMethod(String name, Class[] params) -- 使用特定的参数类型,获得类声明的命名的方法
	
	Method[] getDeclaredMethods() -- 获得类声明的所有方法
 */

/**
* 	---------- 下面用 funField() 做实例-----------
	获得字段信息的Class 反射调用不同于那些用于接入构造函数的调用,在参数类型数组中使用了字段名:
	
	Field getField(String name) -- 获得命名的公共字段
	
	Field[] getFields() -- 获得类的所有公共字段
	
	Field getDeclaredField(String name) -- 获得类声明的命名的字段
	
	Field[] getDeclaredFields() -- 获得类声明的所有字段
 */
public class Reflection {
	
	public static void funConstructor() throws Exception{
		/**
		 * 获取某个类活某个  对象所对应的Class对象的常用3方式
		 * 1.使用Class类的静态方法  ---- forName:Class.forName("包名.类名")
		 * 2.实用类的.class语法:*****.class
		 * 3.使用对象的getClass()方法  Class<?> class = ***.getClass()
		 */
		Class<?> cls = Class.forName("com.fs.Person");
		//等价于-----> Class<?> cls = Person.class;
		//等价于-----> Person p = new Person();    Class<?> cls = p.getClass();
		
		// 获得使用指定的参数类型的公共构造函数
		Constructor construct = cls.getConstructor(new Class[]{String.class});
		System.out.println(construct);
		System.out.println("**************************");
		
		//获得类的所有公共构造函数
		Constructor[] constructors = cls.getConstructors();
		for (Constructor constructor : constructors) {
			System.out.println(constructor);
		}
		System.out.println("**************************");
		
		//获得类的指定构造函数(包括私有)
		Constructor constructAll = cls.getDeclaredConstructor(new Class[]{String.class,int.class});
		System.out.println(constructAll);
		System.out.println("**************************");
		
		//获得类的所有构造函数(包括私有)
		Constructor[] constructorsAll = cls.getDeclaredConstructors();
		for (Constructor constructor : constructorsAll) {
			System.out.println(constructor);
		}
		
		
		/**
		 * 打印结果如下,看到了私有构造函数了吗,反射是不是很屌呢,把另一个类里面的东西都能拿出来
		 *  public com.fs.Person(java.lang.String)
			**************************
			public com.fs.Person()
			public com.fs.Person(java.lang.String)
			**************************
			private com.fs.Person(java.lang.String,int)
			**************************
			public com.fs.Person()
			private com.fs.Person(java.lang.String,int)
			public com.fs.Person(java.lang.String)
		 */
	}
	
	public static void funMethod() throws Exception, SecurityException {
		/**
		 * 获取某个类活某个  对象所对应的Class对象的常用3方式
		 * 1.使用Class类的静态方法  ---- forName:Class.forName("包名.类名")
		 * 2.实用类的.class语法:*****.class
		 * 3.使用对象的getClass()方法  Class<?> class = ***.getClass()
		 */
		//等价于-----> Class<?> cls = Class.forName("com.fs.Person");
		Class<?> cls = Person.class;
		//等价于-----> Person p = new Person();    Class<?> cls = p.getClass();
		
		//获得类的所有公共方法  当然也包括它所实现接口的方法
		Method[] methods = cls.getMethods();
		for (Method method : methods) {
			System.out.println(method);
		}
		System.out.println("*************************");
		Method method = cls.getMethod("add", new Class[]{int.class,int.class});
		System.out.println(method);
		System.out.println("*************************");
		
		//获得类声明的所有方法
		Method[] methodsAll = cls.getDeclaredMethods();
		for (Method method2 : methodsAll) {
			System.out.println(method2);
		}
		System.out.println("*************************");
		
		//使用特定的参数类型,获得类声明的命名的方法
		Method methodAll = cls.getDeclaredMethod("name", new Class[]{String.class});
		System.out.println(methodAll);
		
		/** 打印结果如下 第一条是我们自定义的公有方法,其他的是它所实现接口的方法
		 *  public void com.fs.Person.add(int,int)
			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 native void java.lang.Object.wait(long) throws java.lang.InterruptedException
			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 void com.fs.Person.add(int,int)
			*************************
			private int com.fs.Person.age(int)
			public void com.fs.Person.add(int,int)
			private void com.fs.Person.name(java.lang.String)
			*************************
			private void com.fs.Person.name(java.lang.String)

		 */
	}

	public static void funField() throws Exception, SecurityException {
		/**
		 * 获取某个类活某个  对象所对应的Class对象的常用3方式
		 * 1.使用Class类的静态方法  ---- forName:Class.forName("包名.类名")
		 * 2.实用类的.class语法:*****.class
		 * 3.使用对象的getClass()方法  Class<?> class = ***.getClass()
		 */
		//等价于-----> Class<?> cls = Class.forName("com.fs.Person");
		//等价于----->Class<?> cls = Person.class;
		Person p = new Person();    
		Class<?> cls = p.getClass();
		//所有获得命名的公共字段
		Field[] fields = cls.getFields();
		for (Field field : fields) {
			System.out.println(field);
		}
		System.out.println("***************");
		
		//获得指定的公共字段
		Field field = cls.getField("address");
		System.out.println(field);
		System.out.println("***************");
		
		//获得类声明的所有字段
		Field[] fieldAll = cls.getDeclaredFields();
		for (Field field2 : fieldAll) {
			System.out.println(field2);
		}
		System.out.println("***************");
		
		//获得类声明的指定字段
		Field fieAll = cls.getDeclaredField("phone");
		System.out.println(fieAll);
		/**
		 *  打印结果如下:
		 *  public person() 的构造方法
			public java.lang.String com.fs.Person.address
			***************
			public java.lang.String com.fs.Person.address
			***************
			public java.lang.String com.fs.Person.address
			private int com.fs.Person.phone
			***************
			private int com.fs.Person.phone
		 */
	}
	
	public static void main(String[] args) throws Exception {
		
		funConstructor();
		funMethod();
		funField();
		/**
		 * 
		 * 我们得到这些东西用来干嘛?
		 * 平时我们要得到对象都是 通过new出来
		 * 但是private修饰的我们是访问不到的
		 * 一般都是留一个get set的公共接口
		 * 这时的反射就派上用场了
		 * 现在的反射的基本操作
		 * 下一节就来分析用这些东西到底能干什么
		 * 
		 */

	}
	
}


请看下一节反射简单的运用------------------->

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