反射-反射配置文件

Class类:

获取Class对象的三种方式

方式: 通过Object类中的getObject()方法

Person p = new Person();

Class c = p.getClass();

 

方式二通过 类名.class 获取到字节码文件对象(任意数据类型都具备一个class静态属性,看上去要比第一种方式简单)。

Class c2 = Person.class;

 

方式三通过Class类中的方法(将类名作为字符串传递给Class类中的静态方法forName即可)。

Class c3 = Class.forName("Person");

注意:第三种和前两种的区别

前两种你必须明确Person类型.

后面是指定这种类型的字符串就行.这种扩展更强.我不需要知道你的类.我只提供字符串,按照配置文件加载就可以了

 

 

 通过反射方式,获取私有构造方法,创建对象 

 

获取私有构造方法,步骤如下:

 

1. 获取到Class对象

 

2. 获取指定的构造方法

 

3. 暴力访问, 通过setAccessible(boolean flag)方法

 

4. 通过构造方法类Constructor中的方法,创建对象

 

public T newInstance(Object... initargs)

 通过反射获取成员变量并使用

在反射机制中,把类中的成员变量使用类Field表示。可通过Class类中提供的方法获取成员变量:

返回一个成员变量

n public Field getField(String name) 获取指定的 public修饰的变量

n public Field getDeclaredField(String name) 获取指定的任意变量

返回多个成员变量

n public Field[] getFields() 获取所有public 修饰的变量

n public Field[] getDeclaredFields() 获取所有的 变量 (包含私有)

通过反射,创建对象,获取指定的成员变量,进行赋值与获取值操作

获取成员变量,步骤如下:

1. 获取Class对象

2. 获取构造方法

3. 通过构造方法,创建对象

4. 获取指定的成员变量(私有成员变量,通过setAccessible(boolean flag)方法暴力访问)

5. 通过方法,给指定对象的指定成员变量赋值或者获取值

u public void set(Object obj, Object value)

在指定对象obj中,将此 Field 对象表示的成员变量设置为指定的新值

u public Object get(Object obj)

          返回指定对象obj中,此 Field 对象表示的成员变量的值

 

 通过反射获取成员方法并使用

 

在反射机制中,把类中的成员方法使用类Method表示。可通过Class类中提供的方法获取成员方法:

 

返回获取一个方法:

 

n public Method getMethod(String name, Class<?>... parameterTypes)

 

  获取public 修饰的方法

 

n public Method getDeclaredMethod(String name, Class<?>... parameterTypes)

 

  获取任意的方法,包含私有的

 

参数1: name 要查找的方法名称; 参数2parameterTypes 该方法的参数类型

 

返回获取多个方法:

 

n public Method[] getMethods() 获取本类与父类中所有public 修饰的方法

 

public Method[] getDeclaredMethods() 获取本类中所有的方法(包含私有的)

反射配置文件:

className=com.oracle.demo02.Student
methodName=study

import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;
public class Demo02 {
 public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
  //创建Properties集合
  Properties pro=new Properties();
  //明确数据源
  FileInputStream fis=new FileInputStream("src/com/oracle/demo02/config.properties");
  //将Properties文件中的数据读取到Properties集合中
  pro.load(fis);
  //获取完整包名+类名
  String className=pro.getProperty("className");
  //获取方法名
  String methodName=pro.getProperty("methodName");
  //获取calss对象
  Class c=Class.forName(className);
  //获取方法对象
  Method m=c.getMethod(methodName);
  //快速创建对象
  Object obj=c.newInstance();
  m.invoke(obj);
 }
}

 

posted on 2020-04-28 17:13  煎饼果子不要果子谢谢  阅读(133)  评论(0编辑  收藏  举报

导航