java反射

这是本人一个字一个字敲出来的,如有错误,还请多多指教,谢谢!!




反射
获取某个对象的---------构造方法
main(){
Class c = Class.forName("类的路径");//指定某一个类


Constructor con = c.getConstructor();//这里就是指定获取一个构造方法
//getConstructor(...)里面是可以带有参数的,带的参数也就是要获取的类中构造方法的参数类型
//如String.class/int.class......带几个参数,也就是该类中的构造方法的参数个数


//但是目前来说,这样的调用只能访问公共的“构造方法”
//如果要方法私有的构造和方法则需要setAccessible()方法的帮助
con.setAccessible(true);//设置---取消Java语言的访问检查,也就是说设置为可以访问私有的构造方法


Object obj = con.newInstance(); //newInstance()方法也就相当于一个类的new,入:Person p = new Perpon(); 


//该obj对象就已经成了  指定类的那个类的对象了。也就是说现在可以用该对象调用那个类中的方法了。
}


---例子
首先造一个要被反射的类
里面有两个私有成员变量
一个私有方法
一个带两个参数的构造方法//写一个toString方法,方便测试
package cn.xiongchun.iterator.reflect;


public class TagetClass {

private String name;

private Integer age;

private void show(Integer i){
System.out.println("我是"+i+"个可以爱的宝宝!");
}


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


public TagetClass(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
}
--------------操作类
package cn.xiongchun.iterator.reflect;


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




public class TestReflect {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, Exception {
//获得指定类的类对象
Class c = Class.forName("cn.xiongchun.iterator.reflect.TagetClass");
//该方法返回的是指定对象中所有构造方法,甚至私有!但如果c对象是一个接口、基本类型。。。。则返回的是长度为0的数组
//可以在里面带参数类型,以指定是那个带参构造,或者无参构造
Constructor con = c.getDeclaredConstructor(String.class,Integer.class);
//取消Java的语言访问机制,也就是说可以得到其中的私有构造方法
con.setAccessible(true);
//用con表示的构造方法来创建一个实例,可以指定是否有参数
Object obj = con.newInstance("熊春",26);

System.out.println(obj);

//通过Class类的getDeclareField方法,返回该指定对象中的所有声明的字段。
Field field = c.getDeclaredField("name");
//得到最大的访问权限
field.setAccessible(true);

//设置成员变量的值
field.set(obj, "夏青");
System.out.println(obj);

//设置私有变量的值
field = c.getDeclaredField("age");
field.setAccessible(true);
field.set(obj, 33);
System.out.println(obj);

//得到某个指定名字的方法,这里是指定的一个私有方法
Method method = c.getDeclaredMethod("show", Integer.class);
method.setAccessible(true);
//执行该方法
method.invoke(obj, 10);

}
}
----------打印结果
TagetClass [name=熊春, age=26]
TagetClass [name=夏青, age=26]
TagetClass [name=夏青, age=33]
我是10个可以爱的宝宝!


----------------------------------------------------------------------------练习1
package cn.xiongchun.iterator.reflect;


import java.lang.reflect.Method;
import java.util.ArrayList;


public class ArrayListAdd {
public static void main(String[] args) throws Exception {
//这里指定只能存放一个integer类型,但是,我现在要存一个String类型的
ArrayList<Integer> array = new ArrayList<>();
array.add(10);
array.add(20);
array.add(10);
array.add(30);
array.add(10);
//获得集合的对象
Class arrayClass = array.getClass();
//设置该方法的参数
Method arrayAdd = arrayClass.getDeclaredMethod("add", Object.class);

arrayAdd.invoke(array, "熊春");
// System.out.println(array.size());
//注意,集合的长度,等于元素的个数,但是索引的比长多少一的。
for(int i=0 ; i<array.size() ; i++){
System.out.println(array.get(i));
}
}
}


----------------------------------------------------------------------------练习2
目的:通过配置文件设置实际需要使用的类
首先建立两个需要使用的类Student/Teacher
package cn.xiongchun.iterator.reflect;


public class Student {
private String name;

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


private void show() {
System.out.println("我是Student的show方法");
}
}
-----
package cn.xiongchun.iterator.reflect;


public class Teacher {
private String name;
private void show() {
System.out.println("我是Teacher的show方法");
}
@Override
public String toString() {
return "Teacher [name=" + name + "]";
}
}
------
然后就是设置一个配置文件peizhi.txt
className=cn.xiongchun.iterator.reflect.Student
methodName=show
variableName=name


-----
最后就是实际的使用方法
package cn.xiongchun.iterator.reflect;


import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;


public class GetByPropertice {


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


Properties p = new Properties();

FileReader file = new FileReader("src/cn/xiongchun/iterator/reflect/peizhi.txt");
p.load(file);
file.close();
//获取配置文件中的类名,方法名,成员方法名
String className = p.getProperty("className");
String methodName = p.getProperty("methodName");
String variableName = p.getProperty("variableName");
//得到指定文件的Class对象
Class c = Class.forName(className);
//得到构造方法,并造对象
Constructor con = c.getDeclaredConstructor();
Object obj = con.newInstance();
//得到成员变量,并赋值
Field field = c.getDeclaredField(variableName);
field.setAccessible(true);
field.set(obj, "熊春");
//得到指定的方法,并执行方法
Method method = c.getDeclaredMethod(methodName);
method.setAccessible(true);
method.invoke(obj);

System.out.println(obj);
}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值