反射学习备忘

注:本博客为本人学习笔记,仅供参考

一,Class类的三种获取方式

1,Class.forName(“cn.doma.Person”);多用于配置文件加载
2,类名.class。多用于参数传递
3,对象.class
用例:

		public class Main {
			public static void main(String[] args) throws ClassNotFoundException {
				//1,Class.forName("cn.doma.Person");多用于配置文件加载
				Class cls=Class.forName("cn.doma.Person");
				System.out.println(cls);
				//2,类名.class。多用于参数传递
				Class cls2=Person.class;
				System.out.println(cls2);
				//3,对象.class
				Person p=new Person();
				Class cls3=p.getClass();
				System.out.println(cls3);
		
				//同一个.class字节码文件在一次执行中只会加载一次,不论何种加载方式都是同一个
				System.out.println(cls2==cls);
				System.out.println(cls2==cls3);
			}
		}

输出:

sequenceDiagram
class cn.doma.Person
class cn.doma.Person
class cn.doma.Person
true
true

二,获取Class中的属性,方法,构造

1,成员变量获取

  • 1.获取成员变量们
    • Field[]getFields():获取所有public修饰的成员变量
    • Field getField(Strinc name)
    • Field[]getDeclaredFields():获取所有的成员变量,不考虑修饰符
    • Field getDeclaredField(String name)
    用例:
			public static void main(String[] args) throws Exception {
					Person p=new Person();
					Class personClass= Person.class;
					
					Field[] fields=personClass.getFields();
					for (Field field:fields){
						System.out.println(field);
					}
			
			
					System.out.println("-----------------");
					Field field=personClass.getField("pwd");
					System.out.println(field);
			
					System.out.println("-----------------");
					p.setPwd(3);
					Object value= field.get(p);
					System.out.println(value);
			
					System.out.println("-----------------");
					Field field2=personClass.getField("name");
					field2.set(p,"张三");
					System.out.println(p);
			
					System.out.println("==================");
					Field[] fields1=personClass.getDeclaredFields();
					for (Field field3:fields1){
						System.out.println(field3);
					}
			
					System.out.println("-----------------");
					Field age=personClass.getDeclaredField("age");
					//忽略权限修饰符的检查
					age.setAccessible(true);//暴力反射,强制操作私有变量
					Object age2=age.get(p);
					System.out.println(age2);
					age.set(p,20);
					System.out.println(p);
			
				}

输出

	public java.lang.String cn.doma.Person.name
	public int cn.doma.Person.pwd
	-----------------
	public int cn.doma.Person.pwd
	-----------------
	3
	-----------------
	Person{name='张三', age=0, pwd=3}
	==================
	public java.lang.String cn.doma.Person.name
	private int cn.doma.Person.age
	public int cn.doma.Person.pwd
	-----------------
	0
	Person{name='张三', age=20, pwd=3}

  • 2,获取构造方法们
  • Constructor<?>[]getConstructors()
  • *Constructor getConstructor(类<?>… parameterTypes)
  • Constructor一cetDeclaredConstructor(类<?>… parameterTypes)
  • Constructor<?>[]getoeclaredConstructors()
    用例:
	public static void main(String[] args) throws Exception {
			//Person p = new Person();
			Class personClass = Person.class;
	
			  Constructor constructor =personClass.getConstructor(String.class,int.class);
			  Person person= (Person) constructor.newInstance("qiao",20);
			  System.out.println(constructor);
			  System.out.println(person.name);
			  //personClass.newInstance()无参数可以使用
	
		}

输出:

	public cn.doma.Person(java.lang.String,int)
qiao
  • 3.获取成员方法们.

  • *Method[]getMethods()

  • ,Method getMethod(String name,类<?>… parameterTypes)

  • Method[]getDeclaredMethods()

  • Method getDeclaredMethod(String name,类<?>… parameterTypes)

  • 4.获取类名

  • ,String getName()

用例:

public static void main(String[] args) throws Exception {
		Person p = new Person();
		Class personClass = Person.class;

		Method method= personClass.getMethod("eat");
		//method.setAccessible(true);暴力反射
		method.invoke(p);
		Method method2= personClass.getMethod("eatFood", String.class);
		method2.invoke(p,"fish");

		Method[] methods=personClass.getMethods();
		for (Method method1:methods){
			String name=method1.getName();
			System.out.println(name);
		}

		System.out.println("============");
		//获取类名
		String classname=personClass.getName();
		System.out.println(classname);

	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值