黑马程序员-----反射

本文深入探讨Java反射机制的核心概念,包括获取类、方法、字段等信息,并演示如何利用反射进行类实例化、方法调用及字段操作,特别关注泛型约束下向集合添加元素的实现。

------- android培训java培训、期待与您交流! ----------

反射
如何获取.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,通过字节码文件对象 ,获取到指定的构造方法
  getConstructor(参数);
  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,获取指定的public方法
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) 获取值

代码

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

/*
 * 通过反射,向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);
		
		
	}
}

总结

反射机制就是java语言在运行时拥有的一项自观的能力,通过这种能力可以彻底了解自身情况为下一步动作做准备

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值