Java高级----反射总结


一、class对象概念

  (1) Class类也是类的一种,与class关键字是不一样的。
  (2) 手动编写的类被编译后会产生一个Class对象,其表示的是创建的类的类型信息,而且这个Class对象保存在同名.class的文件中(字节码文件),比如创建一个Shapes类,编译Shapes类后就会创建其包含Shapes类相关类型信息的Class对象,并保存在Shapes.class字节码文件中。
  (3) 每个通过关键字class标识的类,在内存中有且只有一个与之对应的Class对象来描述其类型信息,无论创建多少个实例对象,其依据的都是用一个Class对象。
  (4) Class类只存在私有构造函数,因此对应Class对象只能有JVM创建和加载。
  (5) Class类的对象作用是运行时提供或获得某个对象的类型信息,这点对于反射技术很重要。

二、获取class(字节码)对象的方式

1、对象.getClass()方法
package fanse;

public class Customer {
	String name;
	int age;
	String address;
	String tel;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	
	public String getTel() {
		return tel;
	}
	public void setTel(String tel) {
		this.tel = tel;
	}
	public Customer(String name, int age, String address, String tel) {
		super();
		this.name = name;
		this.age = age;
		this.address = address;
		this.tel = tel;
	}
	
}
package fanse;
import java.lang.reflect.Modifier;
public class CustomerDemo {
public static void main(String[] args) {
	//1.对象.getClass();
	Customer c = new Customer("timi", 20, "河南郑州","18749125463");
	//通过反射拿到Customer的Class对象  
	Class c1 = c.getClass();
	//输出Customer对象的全类名
	System.out.println(c1.getName());
	//输出简类名
	System.out.println(c1.getSimpleName());
	//输出父类的全类名
	System.out.println(c1.getSuperclass().getName());
	//获取权限修饰符
	System.out.println(c1.getModifiers());
	//输出底层权限修饰符public的数值
	System.out.println(Modifier.PUBLIC);	
    }
}
2、类名.class
//通过类名.class的方式获取Class对象
Class c1 = Customer.Class();
3、Class.forName(“全类名”)方法
4、类加载器:Class c3 = ClassLoader.getSystemClassLoader().loadClass(“全类名”);
5、class对象常用方法:

  (1) getName(): 获得类的名称,包括包名。
  (2) getSimpleName(): 获得类的名称,不包括包名。
  (3) getSuperClass(): 获得本类的父类的class对象。
  (4) getInterfaces():获得本类所实现的所有接口的class对象。
  (5) getModifiers():获取字段的权限修饰符。
  (6) getModifiers():Modifier.PUBLIC;输出底层权限修饰符public的数值。

三、通过反射实例化对象的步骤

  第一步: 获取class(字节码)对象
  第二步: 通过class对象.newInstance()

四、反射包(java.lang.reflect)

1、(字段)Field类

  (1) getDeclaredField(String name):获取本类中声明的属性,不包括继承过来的。
  (2) Field getField(String name):Class对象.getField获取用public修饰的属性以及继承过来的public字段。
  (3) getDeclaredFields():获取本类中所有的属性(四种权限修饰符修饰的),不包括继承过来的字段。
  (4) Field[] getFields():取得所有public的属性,包括继承的,接口中声明的和自己定义的。
  (5) 常用方法
    ① getModifiers():获取属性的修饰符。

public static void getDeclareField() throws Exception {
Class c = Customers.class ;
//getDeclaredF ield :获取本类中申明的字段
Customers customer = (Customers) C.newInstance( );
Field phone = c.getDeclaredField("phone");
//通过这种方式可以直接给私有属性phone赋值。
phone.setAccessible(true);
phone.set (customer,"18337275355") ;
System.out.println(phone.getModifiers());

    ② 字段对象.get(对象A):获取对象A中的属性。

public static void getDeclareField() throws Exception {
Class c = Customers.class ;
//getDeclaredF ield :获取本类中申明的字段
Customers customer = (Customers) C.newInstance( );
Field phone = c.getDeclaredField("phone");
//通过这种方式可以直接给私有属性phone赋值。
phone.setAccessible(true);
phone.set (customer,"18337275355") ;
System.out.println(phone.get(customer));
}

    ③ set(对象, 属性):通过这种方式可以直接给私有属性赋值。

public static void getDeclareField() throws Exception {
Class c = Customers.class ;
//getDeclaredF ield :获取本类中申明的字段
Customers customer = (Customers) C.newInstance( );
Field f = c.getDeclaredField("name");
//通过这种方式可以直接给私有属性赋值。
f.set (customer," tomcat") ;
System.out.println(f);
}

    ④ 属性对象.setAccessible(boolean flag):设置属性是否可访问,给私有属性赋值的时候用。

public static void getDeclareField() throws Exception {
Class c = Customers.class ;
//getDeclaredF ield :获取本类中申明的字段
Customers customer = (Customers) C.newInstance( );
Field phone = c.getDeclaredField("phone");
//通过这种方式可以直接给私有属性phone赋值。
phone.setAccessible(true);
phone.set (customer,"18337275355") ;
//获取属性的名字
System.out.println(phone.getName());
System.out.println(phone);
}
2、Method(方法)类

  (1) public Method[] getDeclaredMethods():获取本类中声明的所有方法,不包括继承过来的方法。
  (2) public Method[] getMethods():获取所有public声明的方法,包括继承的、接口中声明的和自己定义的方法。
  (3) public Method getMethod(String name, Class<?>… parameterTypes):根据参数名字和类型,获取指定的用public修饰的方法,包括继承的与接口中的。
  (4) public Method getDeclaredMethod(String name, Class<?>… parameterTypes) :
    ① getDeclaredMethod():可获取class对应的类中的声明的所有方法,不包括继承过来的方法
    ② 第一个参数:方法名
    ③ 余下参数:参数列表
    ④ 注意:获取方法时参数类型、class对象的顺序要和方法定义的参数列表类型顺序保持一致。
  (5)常用方法
    ① getModifiers():获取方法的修饰符
    ② getReturnType():获取方法的返回值类型
    ③ getName():获取方法的名字
    ④ getParameterCount():获取方法的参数个数
    ⑤ Parameter[ ] Parameters():获取方法中的参数列表
  (6) 如何通过方法对象调用本方法

方法对象.invoke(参数1、参数2....)     
参数1:调用方法的对象
参数2:调用方法需要的参数的实参

  (7) 如何调用私有方法
    设置方法可访问:方法对象.setAccessible(true)

3、Constructor(构造方法)类

  (1) 作用:用来实例化对象
    ① 构造方法对象.newInstance(参数);
    ② 构造方法对象.setAccessible(true);解决私有构造方法的实例化对象。
  (2) 通过Class对象的如下方法可以获得Constructor对象
    ① Constructor[ ] getDeclaredConstructors():取得class对象中所有的构造方法。
    ② Constructor[ ] getConstructors():取得class中public修饰的构造方法,无法直接获得父类的构造方法。
    ③ Constructor getConstructor(参数1、参数2…)根据参数类型获取对应的构造方法,只获取用public修饰的,如果想获取无参的构造方法,里面不写参数即可。
    ④ Constructor getDeclaredConstructor(参数1、参数2…)根据参数类型获取对应的构造方法,四种权限修饰符都可以
  (3) 常用的方法
    ① getModifiers():获取构造方法的修饰符
    ② getName():获取构造方法的名字
    ③ getParameterCount():获取构造方法的参数个数
    ④ Parameter[] getParameters():获取构造方法中的参数列表

五、反射的作用

    反射机制就是在程序的运行过程中被允许对程序本身进行操作,比如自我检查,进行装载,还可以获取类本身,类的所有成员变量和方法,类的对象,还可以在运行过程中动态的创建类的实例,通过实例来调用类的方法,这就是反射机制一个比较重要的功能了。那么要通过程序来理解反射机制,首先要理解类的加载过程。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值