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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值