java中反射基本使用

这篇博客详细介绍了Java反射的使用,包括通过Field类给成员变量赋值,使用Constructor获取并调用构造方法,获取并操作类的字节码文件以及成员方法,还深入探讨了如何通过反射获取不同类的方法,如Work类的love()方法,以及处理配置文件和集合数据。最后,文章讲解了Java动态代理的概念,展示了如何创建InvocationHandler实现方法的权限校验和日志记录。
摘要由CSDN通过智能技术生成

反射知识点总结

1.反射概念—给成员变量赋值(Field类)

package com.qianfeng.reflect_10;
/**
 * 
 * 什么是反射:
 * 反射就是通过获取类的字节码文件对象:Class
 * 创建该类的实例(通过构造方法:Constroctor类),调用成员方法(Method类),
 * 给成员变量赋值(Field类)
 * 
 * 关于面试题:获取字节码文件的方式有几种
 * 三种方式
 * 	1)Object类的getClass():表中正在运行的Java类(当前类字节码文件)
 * 	2)任意Java类型的.class属性
 * 	3)反射Class类中forName("类或者接口的全限定名称") ;
 * 				com.qianfeng.reflect_10.ReflectDemo
 * @author zhangyang
 *
 */
public class ReflectDemo {
   
	
	public static void main(String[] args) throws Exception {
   
		
		//创建两个Person对象
		Person p1 = new Person("高圆圆", 41) ;
		Person p2 = new Person("高圆圆", 41) ;
		
		System.out.println(p1==p2);//false
		System.out.println(p1.getClass()==p2.getClass());
		Class c1 = p1.getClass() ; //class com.qianfeng.reflect_10.Person
		Class c2 = p2.getClass() ;
		System.out.println(c1==c2);
		
		System.out.println("--------------------------");
		
		//方式2:获取字节码文件
		Class c3 = Person.class ;
		System.out.println(c3);//class com.qianfeng.reflect_10.Person
		Class c4 = Person.class ;
		System.out.println(c3==c4);
		
		System.out.println("----------------------------");
		
		//方式3:获取类的字节码文件对象
		//public static Class<?> forName(String className)

		Class c5 = Class.forName("com.qianfeng.reflect_10.Person") ;
		System.out.println(c5);//class com.qianfeng.reflect_10.Person
		//推荐:第三种:里面参数一个字符串:可以放在配置文件中使用!
	}
}


package com.qianfeng.reflect_10;

public class Person {
   
	
	//属性
	private String name ;//私有的属性
	int age ;
	public String address ;//地址
	
	
	//一些列构造方法
	public Person() {
   }
	
	private Person(String name) {
   
		this.name = name ;
	}
	
	Person(String name,int age){
   
		this.name = name ;
		this.age = age ;
	}
	
	public Person(String name,int age,String address) {
   
		this.name = name ;
		this.age = age ;
		this.address = address ;
	}
	
	//成员方法
	public void show() {
   
		System.out.println("show person");
	}
	
	public String method(int num) {
   
		return "helloJavaEE"+num ;
	}
	
	private  void function(String str) {
   
		System.out.println(str);
}
	
	public void function2() {
   
		System.out.println("helloJavaEE,i'm coming...");
	}
}


</u>*

2.使用反射获取构造方法并使用,(Constructor)

package com.qianfeng.reflect_01;

import java.lang.reflect.Constructor;

/**
 * 
 * 之前的写法:
 * Person p = new Person();通过无参构造方法创建对象
 * Person p = new Person("高圆圆");  形参String---String类型字节码文件格式
 * 							java.lang.String
 * 
 * 使用反射获取构造方法并使用,(Constructor)
 * 
 * 
 Class 类的实例表示正在运行的 Java 应用程序中的类和接口
 * @author zhangyang
 *
 */
public class ReflectDemo {
   
	
	public static void main(String[] args) throws Exception {
   
		
		//获取Person类的字节码文件对象
		//public static Class<?> forName(String className)
		Class c = Class.forName("com.qianfeng.reflect_01.Person") ;
		
		//获取构造方法(构造器)对象
		//public Constructor<?>[] getConstructors():表示获取当前类中的所有的公共的构造方法
		//public Constructor<?>[] getDeclaredConstructors():
		//获取当前类中所有的构造方法:包括私有的,公共的,默认,受保护的(proteted)
		/*
		Constructor[] cons = c.getConstructors() ;
		for(Constructor con: cons) {
			System.out.println(con);
			/**
			 * public com.qianfeng.reflect_01.Person(java.lang.String,int,java.lang.String)
			   public com.qianfeng.reflect_01.Person(
			 */
		//}
		/*
		Constructor[] cons = c.getDeclaredConstructors() ;
		for(Constructor con: cons) {
			System.out.println(con);
		}
		*/
		/**
		 * public com.qianfeng.reflect_01.Person(java.lang.String,int,java.lang.String)
		com.qianfeng.reflect_01.Person(java.lang.String,int)
		private com.qianfeng.reflect_01.Person(java.lang.String)
		public com.qianfeng.reflect_01.Person()
		 */
		
		//获取某一个构造方法所在对象:Constructor
		//public Constructor<T> getConstructor(Class<?>... parameterTypes)
		//获取指定的公共构造方法
		//参数:parameterTypes可变参数  里面相当于数组
		//参数是当前的字节码文件Class
		
		//Person p = new Person();通过无参构造方法创建对象 
		//直接输出p----->如果重写toString():成员信息的表达式 
		
		Constructor con = c.getConstructor() ;//Person类的无参构造方法
		
		//System.out.println(con);//public com.qianfeng.reflect_01.Person()
		
		//通过构造器如何获取当前Person类的实例
		//Constructor创建该类的实例
		//public T newInstance(Object... initargs):参数为当前实际参数
		Object obj = con.newInstance() ;
		System.out.println(obj);//p
		
		System.out.println("--------------------");
		
		Person p = new Person
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值