Java反射机制(未完成)

1、背景

            1)Reflection也就是反射  是Java被视为动态(或准动态)语言的一个关键性质

            2)反射机制指的是程序在运行时能够获取任何类的内部所有信息

2、实现功能概述

            1)只要给定类的全名,即可通过反射获取类的所有信息。

            2)反射可以在程序运行时获取任意一个对象所属的类对象。

            3)在运行时可以获取到类中所有属性对象,并对其操作(包括私有属性)。

            4)在运行时可以获取到类中,父类中所有方法,并调用。

            5)目前主流的应用框架如Struts2,Hibernate,Spring,SpringMVC等框架的核心全部是利用Java的反射机制来实现的。

Class对象的机制与实现

    1、Class对象概述

            1)Class其实就是类的类型

            2)字符串类型就是String,整形类型就是Integer,String和Integer类型就是Class

2、Class对象的常用方法介绍

            技术分享

                newInstance()             实例化对象

3、实例化对象的三种方式

JavaBean

public class Book {
	private int id;
	private String name;
	public String type;
	/**
	 * @return the id
	 */
	public int getId() {
		return id;
	}
	/**
	 * @param id the id to set
	 */
	public void setId(int id) {
		this.id = id;
	}
	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}
	/**
	 * @param name the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}
	/**
	 * @return the type
	 */
	public String getType() {
		return type;
	}
	/**
	 * @param type the type to set
	 */
	public void setType(String type) {
		this.type = type;
	}
	
}
package main;

import bean.Book;

public class Test1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Class demo1=null;
		Class demo2=null;
		Class demo3=null;
		//实例化对象的第一种方式
		try{
			demo1=Class.forName("bean.Book");
		}catch(Exception e){
			e.printStackTrace();
		}
		System.out.println(demo1);
		//实例化对象的第二种方式
		Book bo=new Book();
		Object ob=bo;
		System.out.println("第二种"+ob.getClass());
		//实例化对象的第三种方式
		demo3=Book.class;
		System.out.println("第三种"+demo3);
		//
		
		
		try {
			Book bo1=(Book)demo3.newInstance();
			System.out.println("实例化后的类对象:"+bo1);
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

技术分享

Field 对象的机制与实现

技术分享

package main;

import java.lang.reflect.Field;

import bean.Book;

public class FieldTest {
	//该方法用于使用传递过来的Class对象获取类中的属性
	public void show(Class c1){
		
		Field[] fi=c1.getDeclaredFields(); //{可以将私有属性获取到} getDeclaredFields()获取类中的所有属性
		for(Field ff:fi){
			System.out.println(ff.getName());
			System.out.println(ff.getType());
		}
		System.out.println("~~~~~~~~~~~~~~~~~");
		
		Field[] fi1=c1.getFields();			//只可以获取到公有属性
		for(Field ff1:fi1){
			System.out.println(ff1.getName());
			System.out.println(ff1.getType());
		}
		System.out.println("~~~~~~~~~~~~~~~~~");
	}
	//该方法用于使用传递过来的实体类对象 获取属性以及属性的值
	public void show(Object ob){
		Class c1=ob.getClass();
		Field[] fi=c1.getDeclaredFields();
		for(Field ff:fi){
			try {
				ff.setAccessible(true);
				System.out.println(ff.getName()+":"+ff.get(ob));
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Book bo=new Book();
		bo.setId(1);
		bo.setName("倾城之恋");
		bo.setType("文学");
		
		FieldTest ft=new FieldTest();
		ft.show(Book.class);
		
		Book oob=new Book();
		oob.setId(2);
		oob.setName("那年夏天");
		oob.setType("文学");
		
		FieldTest ft1=new FieldTest();
		ft1.show(oob);
	}

}

技术分享

技术分享

getDeclaredAnnotations()   获取方法的全部注解

package main;

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

import bean.Book;

public class MethodTest {
	//该方法用于获取对象的所有方法名称、返回值类型、以及参数信息
	public void show(Object ob){
		Class c2=ob.getClass();
		Method[] mt=c2.getDeclaredMethods();
		for(Method mm:mt){
			System.out.println("方法名称:"+mm.getName());
			System.out.println("方法修饰符"+Modifier.toString(mm.getModifiers()));
			System.out.println("方法返回值类型"+mm.getReturnType());
			System.out.println("方法参数列表");
			Class[] preType=mm.getParameterTypes();
			for(Class c21:preType){
				System.out.println(c21.getName());
			}
		
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Book bk=new Book();
		bk.setId(3);
		bk.setName("我和凤姐居住的日子");
		bk.setType("惊悚");
		MethodTest mt=new MethodTest();
		mt.show(bk);
	}

}

技术分享

Method 对象的机制与实现

package main;

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

import bean.Book;

public class MethodTest {
	//该方法用于获取对象的所有方法名称、返回值类型、以及参数信息
	public void show(Object ob){
		Class c2=ob.getClass();
		Method[] mt=c2.getDeclaredMethods();
		for(Method mm:mt){
			System.out.println("方法名称:"+mm.getName());
			System.out.println("方法修饰符"+Modifier.toString(mm.getModifiers()));
			System.out.println("方法返回值类型"+mm.getReturnType());
			System.out.println("方法参数列表");
			Class[] preType=mm.getParameterTypes();
			for(Class c21:preType){
				System.out.println(c21.getName());
			}
		
		}
	}
	//该方法用于使用传递过来的实体对象 获取其中的方法 并调用 
	public void showUse(Object ob){
		Class c1=ob.getClass();
		try {
			Method me=c1.getMethod("getName", null);
			try {
				me.invoke(ob, new Object[0]);
			} catch (IllegalAccessException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			Method me1=c1.getMethod("setName", String.class);
			try {
				me1.invoke(ob, "嘻游记");
				Class[] c4={String.class,int.class};
				Method me2=c1.getMethod("test", c4);
				Object[] obb={"哈哈",12};
				me2.invoke(ob, obb);
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}  catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
		} catch (InvocationTargetException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Book bk=new Book();
		bk.setId(3);
		bk.setName("我和凤姐居住的日子");
		bk.setType("惊悚");
		
		//MethodTest mt=new MethodTest();
		//mt.show(bk);
		
		MethodTest mte=new MethodTest();
		mte.showUse(bk);
		System.out.println(bk.getName());
	}

}

技术分享




郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。