黑马程序员_反射

/*
反射由来
程序的后期扩展,有程序了,后期需要加内容
Animal a = new Cat();  Animal a = new Dog();
 可以实现配置文件,之地类,方法,进行运行
目的,就在于扩展,无源码修改!


反射学习的目的
获取一个类的class文件对象的方法
有了class文件后,解剖这个class文件,中文件中直接获取构造方法,普通方法运行起来--反射概念
获取构造方法运行
获取成员方法运行
  万物皆对象, .class是对象,描述类 java.lang.Class
  构造方法是对象,描述类 java.lang.reflect.Constructor
  成员变量是对象,描述类 java.lang.reflect.Field
  普通方法是对象,描述类 java.lang.reflect.Method
*/  
/*
获取一个类的字节码文件对象
通过类的对象获取
通过类的静态属性class获取
通过Class类的静态方法forName(String 类名)获取


获取构造方法,并运行
 一个类的class文件中,直接获取构造方法,运行
 Class描述class文件对象的类的方法
Constructor[] getConstructors 获取class文件中的构造方法,只有公共的public权限,获取多个,存储数组
Constructor getConstructor(Class...c)通过参数列表获取构造方法,想获取什么构造,传递相对应的参数列表
运行构造方法,找构造方法的描述类Constructor,有可以运行构造方法的方法,返回Object newInstance(Object...o)可变参数,运行方法,传递参数,实际传递参数
Class类的方法 getDeclaredConstructors()返回一个Constructor数组,可以获取所有构造方法,包括私有
Class类的方法 getDeclaredConstructor(Class..c)返回一个Constructor类,只有一个构造方法,获取哪一个,传递相对参数列表就可以
Constructor类的有个父类AccessibleObject类,父类中有一个方法setAccessible(boolean )传递的是true,运行期间,JVM取消程序的访问检查,暴力访问。
如果类中,有public修饰的,空参数的构造方法,可以简单获取构造方法并运行,一种简化形式,保证类有public的空参数构造.Class类中,有一个方法 newInstance()可以直接运行空参数,public权限的构造方刚发


获取成员方法并运行
  使用Class类的方法,获取一个类的成员方法
Method[] getMethods()返回字节码文件中的方法,是数组,多个方法,返回public权限的还是继承的或者是实现的方法
Method getMethod(String方法名,Class...c)返回一个方法,传递方法名和参数列表
Method类中,有没有方法,可以运行获取到的方法呢,Object类型invoke()运行方法的方法,调用invoke(Object obj,Object...o),调用invoke运行其他方法的,传递对象,和实际的参数
Method getDeclaredMethod(方法名,参数列表)获取到私有方法
反射通过配置文件运行程序
  需要运行的类,方法,写在配置文件中个,采用键值对存储
  IO读取文件,存储到集合中Properties,反射运行方法
*/
public class Teacher {
public void love(){
System.out.println("老师爱学生");
}
}
public class Sport {
public void sport(){
System.out.println("比赛");
}
}
public class Student {
public void love(){
System.out.println("学生爱老师");
}
}


import java.io.*;
import java.util.*;
import java.lang.reflect.*;
public class ReflectTest {
public static void main(String[] args)throws Exception {
//创建集合对象
Properties pro = new Properties();
//创建IO流,读取配置文件
FileReader fr = new FileReader("c:\\config.properties");
//集合IO管理
pro.load(fr);

for(int x = 1 ; x <= pro.size() / 2; x++){
//通过键值对,获取值
String className = pro.getProperty("className"+x);
String methodName = pro.getProperty("methodName"+x);
//反射获取字节码文件对象
Class clazz = Class.forName(className);
//创建对象
Object obj = clazz.newInstance();
//获取方法
Method method = clazz.getMethod(methodName);
method.invoke(obj);
}
fr.close();
}
}
//反射绕过编译器检查,将不同的数据类型存储到带有泛型的集合中
import java.util.*;
import java.lang.reflect.*;
public class ListDemo {
public static void main(String[] args) throws Exception{


ArrayList<String> array = new ArrayList<String>();
array.add("asdf");
array.add("dgfer");
   //获取ArrayList类的字节码文件对象
Class clazz = array.getClass();
// System.out.println(clazz);
//获取添加方法add
Method method = clazz.getMethod("add", Object.class);
method.invoke(array, 123);
method.invoke(array, 12.34);
method.invoke(array, true);
System.out.println(array);
Iterator it = array.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
for(Object s : array){
System.out.println(s);
}

}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值