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.News");
		Object obj= cls.newInstance();
		Method method = cls.getDeclaredMethod("list", int.class);
		return method.invoke(obj, 2);

1.9. Reflection 反射

this.getClass().getName() //当前Class名字
Thread.currentThread().getStackTrace()[1].getMethodName()); //当前方法名	

1.9.1. 获得所有变量


	Field[] fields = objClass.getFields();
	for (Field field : fields) {
		System.out.println(field.getName());
	}
			

注意:只能去除 public变量

1.9.2. 批量赋值

1.9.3. 方法操作下载

JAVA反射调用方法的步骤有三步

得到要调用类的class
得到要调用的类中的方法(Method)
方法调用(invoke)		

1.9.3.1. 获得所有方法

	Class<?> objClass = a.getClass();
	Method[] methods =  objClass.getDeclaredMethods();
	for (Method method : methods) {
		System.out.println(method);
	}

1.9.3.2. set/get 方法下载

			package cn.netkiller.reflect;

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

public class Member {
	public String name;
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "ClassA [name=" + name + ", age=" + age + "]";
	}

	public Member() {
		// TODO Auto-generated constructor stub
	}

	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
		Class<?> cls = Class.forName("cn.netkiller.reflect.Member");
		Object member = cls.newInstance();
		Method setMethod = cls.getDeclaredMethod("setAge", int.class);
		setMethod.invoke(member, 15);

		Method getMethod = cls.getDeclaredMethod("getAge");
		System.out.println(getMethod.invoke(member));

	}

}
			

下面做一个稍微复杂点的例子,ClassB继承ClassA,取出ClassA的成员变量赋值到ClassA。下载

			package cn.netkiller.reflect;

public class ClassA {
	public String name;
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public ClassA() {
		// TODO Auto-generated constructor stub
	}

	@Override
	public String toString() {
		return "ClassA [name=" + name + ", age=" + age + "]";
	}
}

package cn.netkiller.reflect;

public class ClassB extends ClassA{

	public ClassB() {
		// TODO Auto-generated constructor stub
	}
	private String address;

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	@Override
	public String toString() {
		return "ClassB [address=" + address + "]";
	}

}

package cn.netkiller.reflect;

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

public class ReflectionTest {

	public ReflectionTest() {
		// TODO Auto-generated constructor stub
	}
下载
	public void testSetMethod() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {

		// ClassA a = new ClassA();

		ClassB b = new ClassB();
		b.setAddress("Shenzhen");

		Class<ClassA> classA = ClassA.class;
		ClassA a = classA.newInstance();
		a.setName("Neo");
		a.setAge(30);

		System.out.println(classA.getDeclaredMethod("getAge").invoke(a));

		Method m = classA.getDeclaredMethod("setAge", int.class);
		m.setAccessible(true); // 因为写成private 所以这里必须设置
		m.invoke(b, 26);

		System.out.println(a.toString());
		System.out.println(b.toString());

		System.out.println(b.getName());
		System.out.println(b.getAge());
	}

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

		ReflectionTest rt = new ReflectionTest();
		try {
			rt.testSetMethod();

		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}
			

set 方法

			System.out.println(classA.getDeclaredMethod("getAge").invoke(a));

get 方法

	Method m = classA.getDeclaredMethod("setAge", int.class);
	m.setAccessible(true);	//因为写成private 所以这里必须设置
	m.invoke(b, 26);

1.9.3.3. static 方法调用

			Class cls = Class.forName("cn.netkiller.reflect.Student");
Method setMethod = cls.getDeclaredMethod("setAge",int.class);
setMethod.invoke(cls.newInstance(), 15);	
时间: 2024-10-08 10:29:06

Java 反射,开发框架必备技能的相关文章

java程序员必备技能

前端:jsp,js,javascript,ajax,el,tablelist 后台:线程池,数据库连接池,webservice连接池 框架:maven,spring(IOC.AOP.SOA), 数据库:oracle,mysql web服务器:nginx,apache 分布部署,性能调优 系统集群.负载均衡.反向代理.动静分离,网站静态化 . 分布式缓存技术:memcached,redis,提高系统性能必备 参考:https://www.zhihu.com/question/29031276

Java程序员必备技能内存管理机——垃圾标记

正文 1.怎么找到存活对象? 通过上篇文章我们知道,JVM创建对象时会通过某种方式从内存中划分一块区域进行分配.那么当我们服务器源源不断的接收请求的时候,就会频繁的需要进行内存分配的操作,但是我们服务器的内存确是非常有限的呢!所以对不再使用的内存进行回收再利用就成了JVM肩负的重任了! 那么,摆在JVM面前的问题来了,怎么判断哪些内存不再使用了?怎么合理.高效的进行回收操作?既然要回收,那第一步就是要找到需要回收的对象! 1.1.引用计数法 实现思路:给对象添加一个引用计数器,每当有一个地方引用

01.zookeeper介绍 (中级Java程序员必备技能一)

1.zookeeper是什么? zookeeper是一个开源的分布式协调服务,是google的chubby一个开源的实现.是Hadoop和Hbase的重要组件. 2.zookeeper能做什么? 分布式数据一致性的解决方案数据的发布与订阅.负载均衡.命名服务.master选举.分布式队列.分布式锁. 3.zookeeper的特性 顺序一致性从同一个客户端发起的事务请求,最终会严格按照顺序被应用到zookeeper中 可靠性服务器成功应用了某一个事务数据,并且对客户端做了响应,那么这个数据在整个集

大数据时代,就业转型必备技能!

转型大数据适合的人群 1.Java Java编程是大数据开发的基础,大数据中很多技术都是使用Java编写的,如Hadoop.Spark.mapreduce等,因此,想要学好大数据,Java编程是必备技能! 2.Python Python往往在大数据处理框架中得到支持. 3.Linux运维 企业大数据开发往往是在Linux操作系统下完成的,因此,想从事大数据相关工作,需要掌握Linux系统操作方法和相关命令. 在这里还是要推荐下我自己建的大数据学习交流群:529867072,群里都是学大数据开发的

干货系列2:看看Java桌面应用开发的职业发展空间与必备技能

导读: 我前面两篇文章分别写了java软件开发和java互联网开发工程师的职业发展和技能要素,今天说一说Java桌面应用开发的程序员,他们一般来说对未来发展尤为困惑,确实,用Java可以创建出桌面应用,但只要我们想开发真正的富桌面应用,还需要使用JNI.C/C++等等技能.所有,也许了解如何系统的建立自己的知识体系,是你困惑的的根本原因. 所以,如果你正在(或未来)做Java桌面应用开发,并且对你未来的职业道路感到迷茫和不知所措.跟我来,我将就java桌面应用的发展路线和所需要的技能一一说明,或

java高并发系列 - 第15天:JUC中的Semaphore,最简单的限流工具类,必备技能

这是java高并发系列第15篇文章 Semaphore(信号量)为多线程协作提供了更为强大的控制方法,前面的文章中我们学了synchronized和重入锁ReentrantLock,这2种锁一次都只能允许一个线程访问一个资源,而信号量可以控制有多少个线程可以访问特定的资源. Semaphore常用场景:限流 举个例子: 比如有个停车场,有5个空位,门口有个门卫,手中5把钥匙分别对应5个车位上面的锁,来一辆车,门卫会给司机一把钥匙,然后进去找到对应的车位停下来,出去的时候司机将钥匙归还给门卫.停车

【软帝学院】七点java程序员进阶必备技能

程序员进阶很慢?七点java程序员进阶必备技能,让你少走弯路 一.架构师筑基必备技能 阿里面试更多的内容是架构师基础内容,比如并发编程的AQS.CAS等,多纬度提升架构基础,并发编程高级进阶,JVM性能深度调优,网络编程与高效IO,深入Tomcat底层,Mysql深度优化实战,架构师必备Linux 二.分布式方案及团队协作工具 分布式环境下应该知道的分布式系列问题: 分布式事物解决方案 单点登录解决方案 分布式任务调试解决方案 Maven企业级实战 Jenkins分布式构建实战 Git版本管理

java反射的应用实践

java反射之前接触比较多,但仅技术方面思考的多:这次主要是从业务角度出发,思考java反射在业务模块设计中如何发挥更高效的作用,以提高生产率. 1.业务需求 要处理银行回单票据,提取出付款人.收款人及对应银行和业务信息,每个银行的格式都不统一.所以需要对各家银行的格式进行预处理,规整为标准格式后,交由后续模块处理. 这个预处理格式化的设计有多种 2.方案选型 做法 适用场景 技能要求 在if..else中添加分支逻辑 适用于分支较少的场景,如只有2~4个 简单 把分支逻辑提取为句柄,显示注册到

公共技术点之 Java反射 Reflection

公共技术之 Java反射 Reflection 1. 了解Java中的反射 1.1 什么是Java的反射 Java反射是可以让我们在运行时获取类的函数.字段.父类.接口等Class内部信息的机制.通过反射还可以让我们在运行期实例化对象,调用方法,通过调用get/set方法获取变量的值,即使方法或字段是私有的的也可以通过反射的形式调用,这种"看透class"的能力被称为内省,这种能力在框架开发中尤为重要. 有些情况下,我们要使用的类在运行时才会确定,这个时候我们不能在编译期就使用它,因此