java反射的使用

Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

     下面介绍下java反射机制的使用
package cn.csdn.reflect;
import java.awt.Button;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.LinkedList;

public class ReflectClass {

	//参考地址    http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html

	public void geteClassBegin(){
		Demo demo = new Demo();
		System.out.println(demo.getClass().getSuperclass());

		String str = "23432";;
		System.out.println(str.getClass());  //  getClass java.lang.String          class   .getSuperclass() java.lang.Object

		Button b = new Button();
		System.out.println(b.getClass().getSuperclass().getSuperclass());

		System.out.println(Boolean.TYPE); 

		LinkedList linkedList = new LinkedList();
		System.out.println(linkedList.getClass().getSuperclass().getSuperclass().getSuperclass().getSuperclass());

	}

	//3种不同的方法获取类名
	public void getClassMethod(){
		try {
			//鉴于使用这种方式
			Class<?> demo = Class.forName("cn.csdn.reflect.Demo");
			System.out.println(demo.getName());

			Class<?> demo1 = Demo.class;
			System.out.println(demo1.getName());

			Class<?> demo2 = new Demo().getClass();
			System.out.println(demo2.getName());

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	//通过无参构造实例化对象   -- Demo
	public void getNewClass(){
		try {
			Class<?> clas = Class.forName("cn.csdn.reflect.Demo");
			Demo demo = (Demo)clas.newInstance();
			demo.setAddress("黑悲伤");
			demo.setEmail("[email protected]");
			System.out.println(demo.toString());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	//获取类中所有的构造函数  --Demo1
	public void getConstructor() throws Exception{
		Class<?> clas = Class.forName("cn.csdn.reflect.Demo1");
		Constructor<?> cons[] = clas.getConstructors();
		for(Constructor<?> con:cons){
			System.out.println(con);
		}
	}

	//class 获取一个类的全部框架 ---- Demo1的属性   本类属性的获取和父类的所有public的获取
	public void getClassAll() throws Exception{
		Class<?> clas = Class.forName("cn.csdn.reflect.Demo1");
		//获取Demo1的全部属性及类型

		// getDeclaredFields  获取这个类的所有属性字段 包括 private  public  proteced
		Field[] fields = clas.getDeclaredFields();
		for(Field field:fields){
			//System.out.println(field);
			int modifier = field.getModifiers();
			String str = Modifier.toString(modifier);
			//输出值如:    private  java.lang.Integer  id
			System.out.println(str+"========="+field.getType().getName()+"======"+field.getName());
		}

		//getFields  获取  本类及父类的所有public的方法   只有public的方法
		Field[] fields1 = clas.getFields();
		for(Field field:fields1){
			System.out.println(field);
			int mo = field.getModifiers();
			String str = Modifier.toString(mo);
			System.out.println(str+" "+field.getType().getName()+" "+field.getName());
		}
	}

	//通过反射调用其他类中的方法
	public void getMethod() throws Exception{
		Class<?> clas = Class.forName("cn.csdn.reflect.Demo1");
		//调用Demo1类中的方法 hello
		Method method = clas.getMethod("hello");
		//对方法进行实例化
		method.invoke(clas.newInstance());

	}

	//调用get set 方法
	public void getSetMethod() throws Exception{
		Class<?> clas = Class.forName("cn.csdn.reflect.Demo1");
		Object obj = clas.newInstance();

		Method method = clas.getMethod("getId");
		System.out.println(method.invoke(obj));

	}
	//通过反射操作属性  给属性设置值 如果此属性是私有的,则必须加上setAccessible  如果为共有的  则不用考虑
	public void getOperateAttribute() throws Exception{
		Class<?> clas = Class.forName("cn.csdn.reflect.Demo1");
		Object obj = clas.newInstance();

		Field field = clas.getDeclaredField("name");
		//此属性为私有变量的时候必须要做此操作	 才可以通过访问,否则会报错  java.lang.IllegalAccessException: Class cn.csdn.reflect.ReflectClass can not access a member of class cn.csdn.reflect.Demo1 with modifiers "private"
		field.setAccessible(true);
		field.set(obj,"张三");
		System.out.println(field.get(obj)); 

		//输出结果:张三
	}

	//通过反射类中的Array可以得到数据的信息并可以修改数组的大小
	public void getArrayAttribute() throws Exception{
		int[] array = {1,2,3,4,5};
		Class<?> demo = array.getClass().getComponentType();
		System.out.println("数组的类型:"+demo.getName()+"====数组的长度:"+Array.getLength(array)+"=获取数组的第一个元素="+Array.get(array, 0));
		Array.set(array,0,100);
		System.out.println(Array.get(array, 0));

		//输出结果:
		//数组的类型:int====数组的长度:5=获取数组的第一个元素=1
		//100

	}

	//修改数组的大小 Array.newInstance()方法
	public void getArrayLength() throws Exception{
		int[] array={1,2,3,4,5,6,7,8,9};
		//修改数组大小之前的循环输出
		for(int i = 0;i<Array.getLength(array);i++){
			if(i==(Array.getLength(array)-1)){
				System.out.println();
			}else{
				System.out.print(Array.get(array, i)+" ");
			}
		}
		// 输出  1 2 3 4 5 6 7 8 

		Class<?> demo = array.getClass().getComponentType();
		Object arrayNew = Array.newInstance(demo, 15);
		int length = Array.getLength(array);
		//System.arraycopy()实现数组之间的复制
		//arraycopy(Object src, int srcPos, Object dest, int destPos, int length)  src:源数组   srcPos:源数字开始复制的位置
		//dest 目的数组 (arrayNew)    destPos:目的数组存在的起始位置    length是复制的长度
		System.arraycopy(array, 0, arrayNew, 0, length);
		System.out.println("修改之后的长度为==="+Array.getLength(arrayNew));//15

		for(int i = 0;i<Array.getLength(arrayNew);i++){
			System.out.print(Array.get(arrayNew, i)+" ");
		}

		//1 2 3 4 5 6 7 8 9 0 0 0 0 0 0
	}

	//通过反射得到实体类对应的值
	public void getValue() throws Exception{
		//getFields  获取  本类及父类的所有public的方法   只有public的方法
		// field.get()可以得到对应的实体类中的值
		Class<?> clas = Class.forName("cn.csdn.reflect.Demo1");
		Demo1 demo = (Demo1) clas.newInstance();
		demo.setAddress("2332");
		demo.setEmail("342");
		Field[] fields1 = clas.getFields();
		for(Field field:fields1){
			int mo = field.getModifiers();
			String str = Modifier.toString(mo);
			System.out.println(str+" "+field.getType().getName()+" "+field.getName()+"=="+field.get(demo));
		}

		//输出结果:
		/*
		 *  public java.lang.String phone==null
			public java.lang.String address==2332
			public java.lang.String email==342
		 */

	}

	public void getCase() throws Exception{
		//实例介绍  当想要同时获取一个对象在修改前和修改后的值的时候,可用到反射
		Demo before = null; //获取修改前的对象
		Demo1 vo = null;//获取修改之后的对象
		Class beforeClazz = before.getClass();
		Method[] beforeMethods = beforeClazz.getMethods();
		for (Method method : beforeMethods) {
			//通过之前的对象获取对应的值
			Object beforeValue = method.invoke(before);
			//获取修改之后的值
			Object afterValue = method.invoke(vo);
		}

	}

}

java反射的使用,布布扣,bubuko.com

时间: 2024-11-03 22:06:57

java反射的使用的相关文章

Java反射

1. 介绍 反射是一种能够在程序运行时动态访问.修改某个类中任意属性和方法的机制. 具体:对于任意一个类,都能够知道这个类的所有属性和方法对于任意一个对象,都能够调用它的任意一个方法和属性 在运行时,当加载完类之后,JVM在堆内存中会自动产生一个Class类型的对象,这个对象包含了完整的类的结构信息 这个Class对象就像一面镜子,透过这个镜子看到类的结构 那么,如何得到这个Class对象呢?以下可否 Class c = new Class(); 答案是不行的,因为Class的构造函数定义为私有

Java 反射详解

反射反射,程序员的快乐,今天你快乐了吗?如果你不快乐,没关系,接下来让你快乐起来! 一.什么是反射? 通过百度百科我们可以知道,Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:并且能改变它的属性.而这也是Java被视为动态(或准动态,为啥要说是准动态,因为一般而言的动态语言定义是程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言.从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C

java反射机制(一)—— 利用反射机制实例化对象

一.Java有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载.探知.使用编译期间完全未知的classes.换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体.或对其fields设值.或唤起其methods.(度娘文库是这么说的) 二.这篇文章主要介绍一下通过反射机制去实例化一个类的对象,然后调用其方法.本文主要介绍两种方式,第一种就是通过构造函数来实例化,第二种就是通过Cl

java 反射 详解

本文来自:blog.csdn.net/ljphhj JAVA反射机制:   通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运行的时候还可以动态地去操作他们. 理论的东东太多也没用,下面我们看看实践 Demo - Demo: package cn.lee.demo; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import

【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】

方法1:通过get()方法获取属性值 package com.sxd.test.controller; public class FirstCa{ private Integer num; private String name; private Boolean flag; public Integer getNum() { return num; } public void setNum(Integer num) { this.num = num; } public String getNam

java 反射类的理解与应用

本文主要解析的类是: ClassLodaer,Class,Field,Method,Constructor. 本文的目标很简单,只是对这些常用的反射类进行简单解释.对这些类中常用方法进行介绍. JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对象:在

Java 反射机制

使用 Java 反射机制可以在运行时期检查 Java 类的信息,检查 Java 类的信息往往是你在使用 Java 反射机制的时候所做的第一件事情,通过获取类的信息你可以获取以下相关的内容: Class 对象 类名 修饰符 包信息 父类 实现的接口 构造器 方法 变量 注解 除了上述这些内容,还有很多的信息你可以通过反射机制获得,如果你想要知道全部的信息你可以查看相应的文档 JavaDoc for java.lang.Class 里面有详尽的描述. 在本节中我们会简短的涉及上述所提及的信息,上述的

Java 反射,开发框架必备技能

通过反射技术我们将上面的统一资源定位付(URL) 映射到Class 相当于 class: news method: list parameter: 2 差不多就是下面样子 class News{ public String list(String catagory_id){ ... ... } } 我们只需要在框架核心中分析 url 然后调用对应的方法下载,于此同时将参数传递过去. Class<?> cls = Class.forName("cn.netkiller.reflect.

Java反射与代理

Java反射机制与动态代理,使得Java更加强大,Spring核心概念IoC.AOP就是通过反射机制与动态代理实现的. 1       Java反射 示例: User user = new User(); user.setTime5Flag("test"); Class<?> cls = Class.forName("com.test.User"); //接口必须public,无论是否在本类内部使用!或者使用cls.getDeclaredMethod()

Java反射机制浅析

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. "程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载.探知.使用