java 反射 框架_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.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);
java 反射 框架_Java 反射,开发框架必备技能相关推荐
- java 反射机制_Java反射机制原理探究
反射是Java中的一个重要的特性,使用反射可以在运行时动态生成对象.获取对象属性以及调用对象方法.与编译期的静态行为相对,所有的静态型操作都在编译期完成,而反射的所有行为基本都是在运行时进行的,这是一 ...
- java反射模式_Java反射机制详解
对于一般的开发者,很少需要直接使用Java反射机制来完成功能开发,但是反射是很多框架譬如 Spring, Mybatis 实现的核心,反射虽小,能量却很大. 本文主要介绍反射相关的概念以及API的使用 ...
- java 反射 速度_Java反射,但速度更快
java 反射 速度 在编译时不知道Java类的最快方法是什么? Java框架通常会这样做. 很多. 它可以直接影响其性能. 因此,让我们对不同的方法进行基准测试,例如反射,方法句柄和代码生成. 用例 ...
- Java的反射作用_java反射机制的作用与优点
java的反射机制就是增加程序的灵活性,避免将程序写死到代码里, 例如: 实例化一个 person()对象, 不使用反射, new person(); 如果想变成 实例化 其他类, 那么必须修改源代码 ...
- java反射类型转换_java反射(转)
反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道 ...
- java 反射代价_Java反射机制
# 反射 ## 什么是反射 反射是Java提供的动态执行机制, 可以动态加载类, 动态创建对象, 动态访问属性, 动态调用方法.. 静态执行: Java代码经过编译以后就确定的执行次序, 称为静态执行 ...
- java映射理解_Java反射的理解
Java反射的理解 反射之中包含了一个「反」字,所以想要解释反射就必须先从「正」开始解释. 一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的.于是我们直接对这个类进行实例化,之后使用这个 ...
- java反射方法_java反射之方法反射的基本操作方法
本文接上文"java反射之获取类的信息方法(推荐)",利用反射(invoke)来获取一个类中的方法来执行. 1.定义一个类,包含三个名称相同,参数不同的方法 class A{ pu ...
- java反射类型转换_Java反射探索研究(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankakay 摘要:本文详细深入讲解是Java中反射的机制,并介绍了如何通过反射来生成对象.调用函数.取得 ...
最新文章
- javascript中的constructor
- redis操作大数据
- Mathematica 8 的激活方法 (转载)
- python开发环境spyder_spyder python 2.7-spyder(Python开发环境)下载 v2.1.10官方版--pc6下载站...
- 扩展springmvc组件——当页面跳转时,需要在Controller里面创建一个空方法去跳转或者是创建一个配置类 ||日期格式化说明||自定义格式化器||消息转化器扩展fastjson
- 支撑百亿级应用的 NewSQL——TiDB 在同程旅游的应用
- JavaScript中的Window窗口对象【转载】
- linux的lsm--TCB组成部分的新视角
- NDK集成libjpeg和libpng
- 测试是否支持跨域_浅谈跨域威胁与安全
- ros android 方案,ros android_core学习笔记
- java_version干什么的_java类中serialVersionUID的作用及其使用
- Docker-Compose 基础与实战,看这一篇就够了 | 原力计划
- 基于Snap软件将2A哨兵数据转换为ENVI格式
- 新手程序员必学的代码编程技巧
- 《企业架构的数字化转型》10000字有感
- 关于C#中Remoting的使用
- PS中抠图的几种方法简介
- eboot.php如何转成iso,如何转换成iso格式
- 高通android编译命令,高通Android源码
热门文章
- ubuntu所有php扩展php-7.0扩展列表
- 【STC15库函数上手笔记】3、外部中断
- Linux time()函数解析
- Windos下用setx.exe命令行模式下永久设置系统环境变量
- [react] 你有使用过loadable组件吗?它帮我们解决了什么问题?
- 前端学习(3350):数组方法的运用和数值join
- react学习(37)----获取子组件得实例
- 前端学习(3168):react-hello-react之...扩展运算符
- [css] Reset CSS和Normalize CSS的区别是什么?
- [vue-element]有阅读过ElementUI的源码吗?