反射实例化

2 篇文章 0 订阅
1 篇文章 0 订阅
本文详细介绍了Java中的反射机制,包括通过Class.forName()、Class对象和对象.getClass()获取Class类的三种方式。接着展示了如何使用反射进行对象实例化、调用构造函数、动态方法调用以及读写属性。示例代码涵盖了无参和有参构造函数的调用,私有方法的访问,以及属性的获取和设置。通过这些示例,读者能够深入理解Java反射的使用方法。
摘要由CSDN通过智能技术生成

什么是反射呢?

反射是java语言中的一种机制,通过这种机制可以动态的实例化对象,读写属性,调用方法

这是获取Class类的三种方式示例代码图

package com.zking.jee07.reflect;

public class Test {

	public static void main(String[] args) throws Exception {
		
		//获取大写Class的三种方式
		//1.Class.forName()  得到Student的模板
		Class<Student> stuClazz =(Class<Student>)Class.forName("com.zking.jee07.reflect.Student");
		
		//2.Student.class
		Class<Student> stuClazz01 =Student.class;
		
		//3.对象.getClass()
		Student stu =new Student();
		Class<Student> stuClazz02 =(Class<Student>)stu.getClass();
		
	}
	
}

这是反射实例化的代码示例代码图 

package com.zking.jee07.reflect;

import java.lang.reflect.Constructor;

public class Test02 {

	public static void main(String[] args) throws Exception {
		
		//1.直接new对象
		Student stu =new Student();
		
		//2.反射
		Class<Student> stuClazz =(Class<Student>)Class.forName("com.zking.jee07.reflect.Student");
		
		/*Constructor<Student> c1 =stuClazz.getConstructor();
		Student stu02 =c1.newInstance();*/
		
		//无参构造函数的简便方法
		Student stu02 =stuClazz.newInstance();
		stu02.setSid("01");
		stu02.setSname("zs");
		
		System.out.println("stu02 =" + stu02.getSname());
		
		//获取有参的构造函数
		Constructor<Student> stuCon =stuClazz.getConstructor(String.class);
		Student stu03 =stuCon.newInstance("白萝卜豆腐汤");
		System.out.println("stu03 =" + stu03.getSid());
		
		Constructor<Student> stuCon01 =stuClazz.getConstructor(String.class,String.class);
		Student stu04 =stuCon01.newInstance("04","海带玉米汤");
		System.out.println("stu04 ="+ stu04.getSname());
		
		//调用私有的构造函数
		Constructor<Student> stuCon02 =stuClazz.getDeclaredConstructor(Integer.class);
		//打开私有方法的访问权限  Accessible
		stuCon02.setAccessible(true);
		Student stu05 =stuCon02.newInstance(23);
		System.out.println("stu05 ="+ stu05.age);
		
	}

}

这是反射动态方法调用示例代码图

package com.zking.jee07.reflect;

import java.lang.reflect.Method;

public class Test03 {

	public static void main(String[] args) throws Exception {
		
		//1.传统方式
		Student stu =new Student();
		stu.setSname("白萝卜豆腐汤");
		
		//2.反射
		Class<Student> stuClazz =(Class<Student>)Class.forName("com.zking.jee07.reflect.Student");
		Student stu02 =stuClazz.newInstance();
		stu02.setSid("01");
		stu02.setSname("zs");
		
		//通过反射获取Method
		Method method =stuClazz.getMethod("hello");
		Object obj =method.invoke(stu02);
		System.out.println(obj);
		
		//有参
		Method m02 =stuClazz.getMethod("hello", String.class);
		m02.invoke(stu02, "花花世界迷人眼");
		
		//有返回值的情况,且是私有方法
		//IllegalAccessException 无权访问异常
		Method m03 =stuClazz.getDeclaredMethod("add", Integer.class,Integer.class);
		//打开访问权限
		m03.setAccessible(true);
		int sum =(int)m03.invoke(stu02, 3,3);
		System.out.println(sum);	

	}

}

 这是反射读写属性代码示例图

package com.zking.jee07.reflect;

import java.lang.reflect.Field;


public class Test04 {

	public static void main(String[] args) throws Exception {
		
		Class<Student> stuClazz =(Class<Student>)Class.forName("com.zking.jee07.reflect.Student");
		Student stu02 =stuClazz.newInstance();
		stu02.setSid("01");
		stu02.setSname("zs");
		stu02.setAge(20);
		
		//动态的获取属性的值
		Field f =stuClazz.getField("age");
		int age =(int)f.get(stu02);
		System.out.println(age);
		
		//获取私有的属性    NoSuchFieldException 没有这样一个列的异常
		Field f2 =stuClazz.getDeclaredField("sname");
		//打开属性
		f2.setAccessible(true);
		String name =(String)f2.get(stu02);
		System.out.println(name);
		
		//设置值
		f2.set(stu02, "花花世界迷人眼");
		System.out.println("~~~~~~~~~~"+stu02.getSname());
		
		Field[] f3 =stuClazz.getDeclaredFields();
		for(Field f4:f3) {
			//打开权限
			f4.setAccessible(true);
			System.out.println(f4.getName()+":"+f4.get(stu02));
		}
		
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值