Java反射的用法
Class类
在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息。
反射
Java的反射主要就是使用class对象生成对应类的实例、调用类的方法等对操作。示例代码:
Car.java
public class Car {
	private String brand;
	private String color;
	private Integer maxSpeed;
	public Car() {
	}
	public Car(String brand, String color, Integer maxSpeed) {
		super();
		this.brand = brand;
		this.color = color;
		this.maxSpeed = maxSpeed;
	}
	public String getBrand() {
		return brand;
	}
	public void setBrand(String brand) {
		this.brand = brand;
	}
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	public Integer getMaxSpeed() {
		return maxSpeed;
	}
	public void setMaxSpeed(Integer maxSpeed) {
		this.maxSpeed = maxSpeed;
	}
	@Override
	public String toString() {
		return "Car [brand=" + brand + ", color=" + color + ", maxSpeed="
				+ maxSpeed + "]";
	}
	public void testPrivate() {
		System.out.println("call testPrivate()");
	}
}
ReflectTest.java
public class RelectTest {
	public static void main(String[] args) throws ClassNotFoundException,
			InstantiationException, IllegalAccessException, SecurityException,
			NoSuchFieldException, NoSuchMethodException,
			IllegalArgumentException, InvocationTargetException {
		// 创建class,方法1
		Class<?> clazz = Class.forName("com.Car");
		// 创建class,方法2,相对来说,方法1更适合从配置中读取包的限定名字符串,避免了方法2中需要导包的操作
		clazz = Car.class;
		// 创建对象
		Car car = (Car) clazz.newInstance();
		// 获取所有的属性
		Field[] fields = clazz.getDeclaredFields();
		System.out.print("All fields:");
		for (Field field : fields) {
			System.out.print(field.getName() + ",");
		}
		System.out.println();
		// 获取所有的public属性
		Field[] publicFilds = clazz.getFields();
		System.out.print("All public fields:");
		for (Field field : publicFilds) {
			System.out.print(field.getName() + ",");
		}
		System.out.println();
		// 获取继承或接口中的所有方法
		Method[] methods = clazz.getMethods();
		System.out.println("All methods:");
		for (Method method : methods) {
			System.out.println(method.getReturnType() + " " + method.getName()
					+ "(" + displayClass(method.getParameterTypes()) + ")");
		}
		System.out.println();
		// 获取本类中的public, protected, private方法,不包括继承的方法
		Method[] selfMethods = clazz.getDeclaredMethods();
		System.out.println("All self methods:");
		for (Method method : selfMethods) {
			System.out.println(method.getReturnType() + " " + method.getName()
					+ "(" + displayClass(method.getParameterTypes()) + ")");
		}
		System.out.println();
		// 获取构造函数
		Constructor[] constructors = clazz.getDeclaredConstructors();
		System.out.println("All Constructor:");
		for (Constructor constructor : constructors) {
			System.out.println(constructor.getName() + "("
					+ displayClass(constructor.getParameterTypes()) + ")");
		}
		System.out.println();
		// 获取指定的属性
		Field brandField = clazz.getDeclaredField("brand");
		// 通过属性为字段赋值
		brandField.setAccessible(true);// 由于brand属性为private,必须设置覆盖java对该字段的访问控制检查
		brandField.set(car, "奔驰");
		System.out.println(car);
		// 获取指定的方法
		Method colorSetMethod = clazz.getDeclaredMethod("setColor",
				String.class);
		colorSetMethod.invoke(car, "黑色");
		System.out.println(car);
		Method testPrivateMethod = clazz.getDeclaredMethod("testPrivate");
		testPrivateMethod.invoke(car, null);
	}
	public static String displayClass(Class[] s) {
		StringBuilder sb = new StringBuilder();
		for (Class c : s) {
			if (sb.length() > 0)
				sb.append(", ");
			sb.append(c.getName());
		}
		return sb.toString();
	}
}
Java反射的用法的更多相关文章
- java反射-- Field 用法实践
		java 反射是一种常用的技术手段, 通过加载类的字节码的方式来获取相关类的一些信息 比如成员变量, 成员方法等. Field 是什么呢? field 是一个类, 位于java.lang.reflec ... 
- Java 反射经常用法演示样例
		<pre name="code" class="java">import java.lang.reflect.Constructor; import ... 
- Java 反射的用法 有关Class类的解释
		package com.imooc.test;public class ClassDemo1 { public static void main(String[] args) { Foo fool = ... 
- 不藏了,这些Java反射用法总结都告诉你们
		摘要:Java反射是一种非常强大的机制,它可以在同一个系统中去检测内部的类的字段.方法和构造函数.它非常多的Java框架中,都大量应用了反射技术,如Hibernate和Spring.可以说,反射机制的 ... 
- Java Spring IOC用法
		Java Spring IOC用法 Spring IoC 在前两篇文章中,我们讲了java web环境搭建 和 java web项目搭建,现在看下spring ioc在java中的运用,开发工具为In ... 
- Java反射的理解
		反射的作用: 1.运行时检查类的结构 2.运行时更改类的字段值 3.调用类的方法 准备知识: Class类:虚拟机为每一个对象保存的一份对象所属类的清单: static Class for ... 
- java 反射 动态代理
		在上一篇文章中介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大 ... 
- java反射机制 + Method.invoke解释 getMethod + 反射理解
		功能: 通过读取另一个Dll去创建一个控件(Form,Button,TextBox,DataGridView),然后对当中一些属性进行检查. 创建控件的大致流程是,Assembly->Modul ... 
- Java反射机制深度剖析
		版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! Java反射机制是Java语言中一种很重要的机制,可能在工作中用到的机会不多,但是在很多框架中都有用到这种机制.我们知道Java是一门静态 ... 
随机推荐
- WorldWind源码剖析系列:下载队列类DownloadQueue
			下载队列类DownloadQueue代表具有优先级的下载队列,该类的存储下载请求的数组链表专门按一定的优先级来存储下载请求的.该类的类图如下. 下载队列类DownloadQueue各个字段的含义说明如 ... 
- JAVA调用FTP上传文件
			import java.io.File; import java.io.FileInputStream; import org.apache.commons.net.ftp.FTP; import o ... 
- cloudstack secondary vm starting
			等1个小时,差不多可以进入虚拟机,看日志/var/log/cloud.log 
- 参照示例搭建一个Quertz + Topshelf的一个作业调度服务(基础)
			学习网址:Quartz.NET 入门.使用Topshelf创建Windows服务 来自七七资料 1.直接下载源码 2.配置完成后,安装服务测试应用. 以下是遇到情况和加入的一些内容 1.在进行服务安装 ... 
- cocos2d-x  2.2.3 建工程
			2.2以后不再使用模板安装了. 打开终端,进入cocos2d-x目录下的tools/project-creator,执行命令 ./create_project.py -project [项目名] -p ... 
- Spark内部流程图
			转载自:https://blog.csdn.net/refuil/article/details/52055104 
- HUE的安装
			HUE: Hadoop User Experience 官网地址:http://gethue.com/ Hue官网无法下载,超时. 使用CDH版本安装. 下载地址: http://archive.cl ... 
- Scala_数据类型
			Scala与Java有着相同的数据类型,Scala数据类型都是对象,Scala中没有类似Java中那样的原始类型. Scala 的基本数据类型有: Byte,Short,Int,Long 和 Char ... 
- 2017-2018-2 《网络对抗技术》20155322 Exp8 web基础
			[-= 博客目录 =-] 1-实践目标 1.1-实践介绍 1.2-实践内容 1.3-实践要求 2-实践过程 2.1-Web前端HTML 2.2-Web前端javascipt 2.3-Web后端 2.4 ... 
- 备忘:BLOCK CORRUPTION IN SYSTEM DATAFILE
			http://www.onlinedbasupport.com/2010/12/10/block-corruption-in-system-datafile/ 
