张文鹏个人博客系统
炫酷文字跳动漂浮js特效代码

为什么很多人都想成功,但成功的人只是极少数?不是因为成功有多困难,其实成功简单得很,只要你一开始都有计划,并且能一直做下去,总会成功的。关键是如何面对成功,你失败了,起码还有人同情你,而成功了,连得到同情的机会都没有。 一匹真正的好马,即使在鞭子的影子下,也能飞奔。 如果你没有把握做到,最好就不要承诺,你什么也不承诺,至少别人不会看不起你。 一本好书,就像高级武功秘籍一样,哪怕只是从里面领悟到个一招半势,功力提升起来都是惊人的。 永不放弃,永不放弃又有两个原则,第一个原则是永不放弃,第二个原则就是:当你想放弃时回头看第一个原则。

欢迎来到zwp博客 用心记录点滴生活
博客信息

java反射学习(四)

0
发布时间:『 2018-02-26 22:16 』  博客类别:Java  阅读(228)  评论(0)

第3章 反射练习

3.1 泛型擦除

思考,将已存在的ArrayList<Integer>集合中添加一个字符串数据,如何实现呢?

我来告诉大家,其实程序编译后产生的.class文件中是没有泛型约束的,这种现象我们称为泛型的擦除。那么,我们可以通过反射技术,来完成向有泛型约束的集合中,添加任意类型的元素

代码如下:

public class ReflectTest {

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {

ArrayList<Integer> list = new ArrayList<Integer>();

//添加元素到集合

list.add(new Integer(30));

list.add(new Integer("12345"));

list.add(123);

//list.add("哈哈");//因为有泛型类型的约束

System.out.println(list);

//通过反射技术,实现添加任意类型的元素

//1, 获取字节码文件对象

//Class c = list.getClass();

//Class c = ArrayList.class;

Class c = Class.forName("java.util.ArrayList");

//2, 找到add()方法

// public boolean add(E e)

Method addMethod = c.getMethod("add", Object.class);

//3,  执行add()方法

addMethod.invoke(list, "哈哈");// list.add("哈哈");

System.out.println(list);

}

}

3.2 反射配置文件

通过反射配置文件,运行配置文件中指定类的对应方法

读取Peoperties.txt文件中的数据,通过反射技术,来完成Person对象的创建

Peoperties.txt文件内容如下:

className=cn.itcast_01_Reflect.Person

methodName=method5


读取配置文件,调用指定类中的对应方法

public class ReflectTest2 {

public static void main(String[] args)

throws FileNotFoundException, IOException, ClassNotFoundException, NoSuchMethodException, SecurityException,

InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {

// 通过Properties集合从文件中读取数据

Properties prop = new Properties();

// 读取文件中的数据到集合中

prop.load(new FileInputStream("properties.txt"));

// 获取键所对应的值

String className = prop.getProperty("className");

System.out.println(className);


// 1,获取Person.class 字节码文件对象

Class c = Class.forName(className);

// 2,获取构造方法

// public Person(String name, int age, String address)

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


// 3,创建对象

Object obj = con.newInstance("小明", 20, "中国");

System.out.println(obj);


// 4,获取指定的方法

// private void method5(){}

String methodName = prop.getProperty("methodName");

Method m5 = c.getDeclaredMethod(methodName, null);

// 5,开启暴力访问

m5.setAccessible(true);

// 6,执行找到的方法

m5.invoke(obj, null);

}

}

第4章 总结

4.1 知识点总结

如何获取.Class文件对象

1, 通过Object类 getClass()方法获取 Class对象 

2, 通过类名.class 方式 获取 Class对象

3, 通过反射的方式, Class.forName(String classname) 获取Class对象

public static Class<?> forName(String className)throws ClassNotFoundException

返回与带有给定字符串名的类或接口相关联的 Class 对象


通过反射, 获取类中的构造方法,并完成对象的创建

获取指定的构造方法

  public Constructor<T> getConstructor(Class<?>... parameterTypes)

获取指定的public修饰的构造方法 

  public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)

获取指定的构造方法,包含私有的

  获取所有的构造方法

  public Constructor<?>[] getConstructors() 获取所有的public 修饰的构造方法

  public Constructor<?>[] getDeclaredConstructors() 获取所有的构造方法,包含私有的


通过反射, 获取类中的构造方法,并完成对象的创建

  步骤:

  1,获取字节码文件对象

  2,通过字节码文件对象 ,获取到指定的构造方法

  getConstructor(参数);

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

  public T newInstance(Object... initargs)


私有构造方法,创建对象

1,获取字节码文件对象

  2,通过字节码文件对象 ,获取到指定的构造方法

  getDeclaredConstructor (参数);

  3,暴力访问 

  con.setAccessible(true);

  4,通过构造方法,创建对象

  public T newInstance(Object... initargs)


通过反射,获取Class文件中的方法

  获取指定的方法

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

  获取指定的public方法

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

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

  获取所有的方法

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

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

通过反射,调用方法

  步骤:

  1,获取Class对象

  2,获取构造方法,创建对象

      3,获取指定的public方法

  4,执行方法

  public Object invoke(Object obj, Object... args)


私有方法的调用:

1,获取Class对象

2,获取构造方法,创建对象

3,获取指定的private方法

4,开启暴力访问

m5.setAccessible(true);

5,执行方法

public Object invoke(Object obj, Object... args)


通过反射,获取成员变量(字段)

  获取指定的成员变量

  public Field getField(String name) 获取public修饰的成员变量

  public Field getDeclaredField(String name) 获取任意的成员变量,包含私有

  获取所有的成员变量

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

  public Field[] getDeclaredFields() 获取司所有的成员变量,包含私有


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

  步骤:

  1,获取字节码文件对象

  2,获取构造方法,创建对象

  3,获取指定的成员变量

  4,对成员变量赋值\获取值操作

  public void set(Object obj,  Object value) 赋值

  public Object get(Object obj) 获取值


私有成员变量的使用

  步骤:

  1,获取字节码文件对象

  2,获取构造方法,创建对象

  3,获取指定的成员变量

  4,开启暴力访问

  5,对成员变量赋值\获取值操作

  public void set(Object obj,  Object value) 赋值

  public Object get(Object obj) 获取值


关键字:   java反射笔记  

上一篇:java反射学习(三)

下一篇:没有了

评论信息
暂无评论
发表评论
验证码: 
jquery轮播效果图
励志美句

越努力越幸运!

  • 1
  • 2
  • 3
  • 4
< >
你是本站第位访客
苏ICP备17048714