反射

反射

反射是发生在程序运行期的行为
Java 反射机制,可以实现以下功能:
	①在运行时判断任意一个对象所属的类;
	②在运行时构造任意一个类的对象;
	③在运行时判断任意一个类所具有的成员变量和方法;
	④在运行时调用任意一个对象的方法;
	⑤生成动态代理
1.在创建类型的对象的时候,获取的是类型的Class对象的一个镜像|复制体
2.在一个类加载到内存时就会存在这个类型唯一的Class对象(方法,属性,构造器...)
3.如果能够拿到一个类型的Class对象,就可以操作这个类
获取一个类型的Class对象的方式:
	1.类名.class
	2.对象.getClass()
	3.Class.forName(报名+类名|权限定名)

Class中的常用方法(操作构造器,操作方法,操作字段…)
代码实例:

public class ReflectDemo1 {
	public static void main(String[] args) throws IOException, InstantiationException, IllegalAccessException, ClassNotFoundException {
		/*Person person=new Person();
		person.test();*/
		
	//通过反射创建对象实现动态改变对象
	Properties pro=new Properties();
	pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.propertices"));
	//反射创建对象                                             类名+包名
	 Person person=(Person) Class.forName(pro.getProperty("name")).newInstance();
	 person.test();
}
}



class Person{
	public void test(){
		System.out.println("我是person");
	}
}

class Student extends Person{
	public void test(){
		System.out.println("我是student");
	}
}
class Teacher extends Person{
	public void test(){
		System.out.println("我是Teacher");
	}
}


 public class ReflectDemo2 {
	public static void main(String[] args) throws ClassNotFoundException {
		//一个类型的 Class对象只有一个
		//1.类名.class
		Class<String> cla1=String.class;
		System.out.println(cla1);//打印包名+类名
		
	//2.对象.getClass();
	Class cla2= "字符串".getClass();
	System.out.println(cla1==cla2);//true一个类型的 Class对象只有一个
	
	//3.Class.forName(包名+类名|权限定名); 
	Class cla3=Class.forName("java.lang.String");
	System.out.println(cla2==cla3);
	
	//4.getSuperclass();通过子类对象获取父类对象
	Class cla4=cla3.getSuperclass();
	System.out.println(cla4);
	
	//获取基本数数据类型的对象
	Class clsChar=char.class;
	System.out.println(clsChar);
	
	Class clsCharacter=Character.class;
	System.out.println(clsCharacter);
	
	//从包装类得到基本数据类型的Class对象 Character.TyPE;
	System.out.println(char.class==Character.TYPE);
	
	//Class对象的常用方法
	Class<?>[] arr=cla1.getInterfaces();
	System.out.println(Arrays.toString(arr));
	
	//int getModifiers()返回此类或接口以整数编码的 Java 语言修饰符
	System.out.println(Modifier.toString(cla1.getModifiers()));
	
	//getName() 返回包名+类名
	System.out.println(clsChar.getName());
	
	//getSimpleName() 类名
	System.out.println(cla1.getSimpleName());
	
	//isPrimitive() 判定指定的 Class 对象是否表示一个基本类型
	System.out.println(cla1.isPrimitive());
}
}

public class ReflectDemo3 {

public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
	//testConstructor(User.class);
	testMethod(User.class);
	
}

//操作于构造器的方法
public static void testConstructor(Class cls) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
	/*1.Constructor<T> getConstructor(Class<?>... parameterTypes) 
                  返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法*/
	Constructor con1=cls.getConstructor(String.class);
	System.out.println(con1);
	
	/*2.Constructor<?>[] getConstructors() 
 	返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法*/
	Constructor[] con2=cls.getConstructors();
	System.out.println(Arrays.toString(con2));
	//Constructor->newInstance(Class...) 通过构造器创建对象
	User user=(User) con2[1].newInstance("halo");
	System.out.println(user);
	
	/*3.Constructor getDeclaredConstructor(Class<?>... parameterTypes) 
                  返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法*/
	Constructor con3=cls.getDeclaredConstructor(String.class,double.class);
	System.out.println(con3);//获得default修饰的构造器
	
	Constructor con4=cls.getDeclaredConstructor(String.class,int.class);
	System.out.println(con4);//获得private修饰的构造器
	con4.setAccessible(true);
	User user2=(User) con4. newInstance("halo",38);
	System.out.println(user2);
	con4.setAccessible(false);
	
	/*4.Constructor<?>[] getDeclaredConstructors() 
                  返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法*/
	Constructor[] con5 =cls.getDeclaredConstructors();
	System.out.println(Arrays.toString(con5));
}



//操作方法
public static void testMethod(Class cls) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
	/*1.Method getDeclaredMethod(String name, Class<?>... parameterTypes) 
                  返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。 */
	Method method=cls.getDeclaredMethod("hehe");
	//创建对象
	User user=(User) cls.getDeclaredConstructor().newInstance();
	method.setAccessible(true);
	method.invoke(user);
	method.setAccessible(false);
	
	/*2.Method[] getDeclaredMethods() 
                  返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法*/
	Method[] method2 =cls.getDeclaredMethods();
	System.out.println(Arrays.toString(method2));
	
	/*3.Method getMethod(String name, Class<?>... parameterTypes) 
                  返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法*/
	Method method3=cls.getMethod("haha");
	method3.invoke(user);
	
	/*4.Method[] getMethods() 
	返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法*/
	
}
}



class User{
	public String name;
	int age;
	private double money;

public User() {
	// TODO Auto-generated constructor stub
}
public User(String name) {
	this.name = name;
}

private User(String name,int age) {
	this.name = name;
	this.age=age;
}
User(String name, double money) {
	this.name = name;
	this.money = money;
}

public User(String name, int age, double money) {
	super();
	this.name = name;
	this.age = age;
	this.money = money;
}

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 double getMoney() {
	return money;
}
public void setMoney(double money) {
	this.money = money;
}

public void haha(){
	System.out.println("hahahhaa...");
}
private static void hehe(){
	System.out.println("hehhehhe...");
}
void xixi(){
	System.out.println("xixixixi...");
}
@Override
public String toString() {
	System.out.println("toString()方法执行啦");
	return "User [name=" + name + ", age=" + age + ", money=" + money + "]";
}
}
内容概要:《2024年中国城市低空经济发展指数报告》由36氪研究院发布,指出低空经济作为新质生产力的代表,已成为中国经济新的增长点。报告从发展环境、资金投入、创新能力、基础支撑和发展成效五个维度构建了综合指数评价体系,评估了全国重点城市的低空经济发展状况。北京和深圳在总指数中名列前茅,分别以91.26和84.53的得分领先,展现出强大的资金投入、创新能力和基础支撑。低空经济主要涉及无人机、eVTOL(电动垂直起降飞行器)和直升机等产品,广泛应用于农业、物流、交通、应急救援等领域。政策支持、市场需求和技术进步共同推动了低空经济的快速发展,预计到2026年市场规模将突破万亿元。 适用人群:对低空经济发展感兴趣的政策制定者、投资者、企业和研究人员。 使用场景及目标:①了解低空经济的定义、分类和发展驱动力;②掌握低空经济的主要应用场景和市场规模预测;③评估各城市在低空经济发展中的表现和潜力;④为政策制定、投资决策和企业发展提供参考依据。 其他说明:报告强调了政策监管、产业生态建设和区域融合错位的重要性,提出了加强法律法规建设、人才储备和基础设施建设等建议。低空经济正加速向网络化、智能化、规模化和集聚化方向发展,各地应找准自身比较优势,实现差异化发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值