java 中反射的使用_java中反射的基本使用

fanShe.java

package example5;

class fanShe{

/*1.应用在一些通用性比较高的代码中。

*2.后面学的框架,大多数都是应用框架来实现的。

*3.在框架开发中,都是基于配置文件来开发。在配置文件中配置了类,可以通过反射得到类中的所有内容,可以让类中的某个方法来执行。

*类中的所有内容:属性,没有参数的构造方法,有参数的构造方法,普通方法。

*反射的原理:

*代码保存在.java文件中保存至本地硬盘-->编译得到.class文件-->把class类使用jvm中的类加载器加载至内存-->Class类(字节码文件在内存中的表示)

*我如果得到了这个Class类,便可以得到类里所有的内容

*使用反射首先需要得到Class类(三种方法)

*(1)类名.class

*(2)对象名.getClass()

*(3)使用Class.forName("类的路径")

*属性通过一个类Field获得。

*构造方法通过一个类constructor获得。

*普通方法通过一个类method获得。

*/

private String name;

int age;

//无参数的构造方法

public fanShe() {}

//有参数的构造方法

public fanShe(String name, int age) {

super();

this.name = name;

this.age = 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;

}

}

testFanshe.java

package example5;

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import org.junit.Test;

class testFanshe {

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

// 得到Class类的三种方法

Class c1 = fanShe.class;

Class c2 = new fanShe().getClass();

Class c3 = Class.forName("example5.fanShe");

/*test1();

test2();

test3();*/

test4();

}

// 反射操作无参数的构造方法

public static void test1() throws Exception {

Class c3 = Class.forName("example5.fanShe");

// 得到反射类的一个实例

fanShe f1 = (fanShe) c3.newInstance();

// 用实例去调用类中的方法

f1.setName("宝娟");

System.out.println(f1.getName());

}

// 反射操作有参数的构造方法

@Test

public static void test2() throws Exception {

// 得到Class类

Class c3 = Class.forName("example5.fanShe");

// 得到有参数的构造方法类

// 传递的是有参数的构造方法里的参数类型,以class类型传递

Constructor con = c3.getConstructor(String.class, int.class);

// 通过有参的构造方法设置实例的值

fanShe p1 = (fanShe) con.newInstance("阿苏", 20);

System.out.println(p1.getName() + "  " + p1.getAge());

}

// 反射操作类的属性

public static void test3() {

// 得到Class类

try {

Class c2 = Class.forName("example5.fanShe");

// 得到类的一个实例

fanShe p2 = (fanShe) c2.newInstance();

// 得到name属性,参数是属性名称

Field f1 = c2.getDeclaredField("name");

//表示允许操作私有属性

f1.setAccessible(true);

//为name属性设置值,第一个参数是类的一个实例,第二个参数是要设置的值。

f1.set(p2, "wangwu");

// 得到属性值并打印输出

System.out.println(f1.get(p2));

} catch (Exception e) {

e.printStackTrace();

}

}

//使用反射来操作普通方法

public static void test4() throws Exception {

//得到Class类

Class c4=Class.forName("example5.fanShe");

//得到类的一个实例

fanShe p4=(fanShe) c4.newInstance();

//得到普通方法的类的方法,第一个参数是要操作的普通方法的名称,第二个参数是普通方法中传入参数的类型。

Method f4=c4.getDeclaredMethod("setAge", int.class);

//操作的是私有方法

f4.setAccessible(true);

//此函数是使普通方法运行,并设置值。第一个参数是类的一个实例,第二个参数是要设置的值。

f4.invoke(p4,15);

//将设置的值打印输出

System.out.println(p4.getAge());

}

/*注:当操作的方法是静态方法是,由于静态方法的调用方式是 类名.方法名

* 所以不需要类的实例

* 在invoke()方法中的第一个参数直接写为null

* f4.invoke(null,15);

*/

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值