通过反射技术我们将上面的统一资源定位付(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 反射,开发框架必备技能相关推荐

  1. java 反射机制_Java反射机制原理探究

    反射是Java中的一个重要的特性,使用反射可以在运行时动态生成对象.获取对象属性以及调用对象方法.与编译期的静态行为相对,所有的静态型操作都在编译期完成,而反射的所有行为基本都是在运行时进行的,这是一 ...

  2. java反射模式_Java反射机制详解

    对于一般的开发者,很少需要直接使用Java反射机制来完成功能开发,但是反射是很多框架譬如 Spring, Mybatis 实现的核心,反射虽小,能量却很大. 本文主要介绍反射相关的概念以及API的使用 ...

  3. java 反射 速度_Java反射,但速度更快

    java 反射 速度 在编译时不知道Java类的最快方法是什么? Java框架通常会这样做. 很多. 它可以直接影响其性能. 因此,让我们对不同的方法进行基准测试,例如反射,方法句柄和代码生成. 用例 ...

  4. Java的反射作用_java反射机制的作用与优点

    java的反射机制就是增加程序的灵活性,避免将程序写死到代码里, 例如: 实例化一个 person()对象, 不使用反射, new person(); 如果想变成 实例化 其他类, 那么必须修改源代码 ...

  5. java反射类型转换_java反射(转)

    反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道 ...

  6. java 反射代价_Java反射机制

    # 反射 ## 什么是反射 反射是Java提供的动态执行机制, 可以动态加载类, 动态创建对象, 动态访问属性, 动态调用方法.. 静态执行: Java代码经过编译以后就确定的执行次序, 称为静态执行 ...

  7. java映射理解_Java反射的理解

    Java反射的理解 反射之中包含了一个「反」字,所以想要解释反射就必须先从「正」开始解释. 一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的.于是我们直接对这个类进行实例化,之后使用这个 ...

  8. java反射方法_java反射之方法反射的基本操作方法

    本文接上文"java反射之获取类的信息方法(推荐)",利用反射(invoke)来获取一个类中的方法来执行. 1.定义一个类,包含三个名称相同,参数不同的方法 class A{ pu ...

  9. java反射类型转换_Java反射探索研究(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankakay 摘要:本文详细深入讲解是Java中反射的机制,并介绍了如何通过反射来生成对象.调用函数.取得 ...

最新文章

  1. javascript中的constructor
  2. redis操作大数据
  3. Mathematica 8 的激活方法 (转载)
  4. python开发环境spyder_spyder python 2.7-spyder(Python开发环境)下载 v2.1.10官方版--pc6下载站...
  5. 扩展springmvc组件——当页面跳转时,需要在Controller里面创建一个空方法去跳转或者是创建一个配置类  ||日期格式化说明||自定义格式化器||消息转化器扩展fastjson
  6. 支撑百亿级应用的 NewSQL——TiDB 在同程旅游的应用
  7. JavaScript中的Window窗口对象【转载】
  8. linux的lsm--TCB组成部分的新视角
  9. NDK集成libjpeg和libpng
  10. 测试是否支持跨域_浅谈跨域威胁与安全
  11. ros android 方案,ros android_core学习笔记
  12. java_version干什么的_java类中serialVersionUID的作用及其使用
  13. Docker-Compose 基础与实战,看这一篇就够了 | 原力计划
  14. 基于Snap软件将2A哨兵数据转换为ENVI格式
  15. 新手程序员必学的代码编程技巧
  16. 《企业架构的数字化转型》10000字有感
  17. 关于C#中Remoting的使用
  18. PS中抠图的几种方法简介
  19. eboot.php如何转成iso,如何转换成iso格式
  20. 高通android编译命令,高通Android源码

热门文章

  1. ubuntu所有php扩展php-7.0扩展列表
  2. 【STC15库函数上手笔记】3、外部中断
  3. Linux time()函数解析
  4. Windos下用setx.exe命令行模式下永久设置系统环境变量
  5. [react] 你有使用过loadable组件吗?它帮我们解决了什么问题?
  6. 前端学习(3350):数组方法的运用和数值join
  7. react学习(37)----获取子组件得实例
  8. 前端学习(3168):react-hello-react之...扩展运算符
  9. [css] Reset CSS和Normalize CSS的区别是什么?
  10. [vue-element]有阅读过ElementUI的源码吗?