反射的实例化及动态的方法调用

本文介绍了Java的反射机制,通过三种方式获取类对象的全路径,并详细阐述了如何利用反射进行对象的动态实例化,包括调用构造函数、读写属性及方法。内容涵盖反射实例化的过程及其在实际编程中的应用。
摘要由CSDN通过智能技术生成

1.思维导图

 2.反射

反射是java语言的一种机制,利用反射机制动态的实例化对象(构造函数)、读写属性、调用方法

类对象获取全路径的三种方式:

  1.Class.forName
  2.类.class
  3.类类的类对象的类实例化.getClass();

package com.LSZ.fs;

public class Q {

	public static void main(String[] args) throws Exception {
		// 类名.class
		Class c = Student.class;
		System.out.println(c);
		// 对象名.getclass
		Student s = new Student();
		System.out.println(s.getClass());
		// class.forname
		Class forname = Class.forName("com.LSZ.fs.Student");
		System.out.println(forname);

		// 获取全限定名
		System.out.println(c.getName());
		// 获取类名
		System.out.println(c.getSimpleName());
		// 获取包名
		System.out.println(c.getPackage());
	}
}

3.反射的实例化

package com.LSZ.fs;

import java.lang.reflect.Constructor;
import java.util.Iterator;

public class demo {

	public static void main(String[] args) throws Exception {
		// 加载类对象
		Class<Student> stu1 = (Class<Student>) Class.forName("com.demo.Student");

		System.out.println("--------所有公有的构造方法---------");
		Constructor[] constr = stu1.getConstructors();
		for (Constructor constructor : constr) {
			System.out.println(constructor);
		}

		System.out.println("------------私有构造方法----------------");
		Constructor[] decon = stu1.getDeclaredConstructors();
		for (Constructor constre : decon) {
			System.out.println(constre);
		}

		System.out.println("---------共有的,有参构造方法---------");
		Constructor<Student> c = stu1.getConstructor(String.class);

		Student s1 = c.newInstance("s011");

		System.out.println("---------私有构造方法 有参---------");
		Constructor<Student> c2 = stu1.getDeclaredConstructor(Integer.class);
		c2.setAccessible(true);// 打开访问权限
		Student s2 = c2.newInstance(12);
	}
}

输出:

静态加载
--------所有公有的构造方法---------
public com.LSZ.fs.Student(java.lang.String)
public com.LSZ.fs.Student()
public com.LSZ.fs.Student(java.lang.String,java.lang.String)
------------私有构造方法----------------
private com.LSZ.fs.Student(java.lang.Integer)
public com.LSZ.fs.Student(java.lang.String)
public com.LSZ.fs.Student()
public com.LSZ.fs.Student(java.lang.String,java.lang.String)
---------共有的,有参构造方法---------
有参构造方法
---------私有构造方法 有参---------
私有构造

获取成员方法以及调用

package com.LSZ.fs;

import java.lang.reflect.Method;

public class demo2 {

	public static void main(String[] args) throws Exception {
		// 加载类对象
		Class<Student> stu1 = (Class<Student>) Class.forName("com.demo.Student");

		// 获取成员方法hello()
		System.out.println("--------成员方法hello()----------");
		Method method = stu1.getMethod("hello", String.class);
		// 参数1为方法名字 参数二为方法参数类型 无参方法不需要填写

		// 获取Student对象
		Student s = stu1.newInstance();
		/*
		 * invok参数 参数1: 类实例 参数2:当前方法传递的参数值 返回值:方法的返回值 如果是void 那么返回null
		 */
		Object invoke1 = method.invoke(s, "张三");
		System.out.println("返回值:" + invoke1);

		// 获取私有方法add()
		System.out.println("--------私有方法add()----------");
		Method declmet = stu1.getDeclaredMethod("add", Integer.class, Integer.class);
		declmet.setAccessible(true);
		Student s1 = stu1.newInstance();
		Object invoke2 = declmet.invoke(s1, 12, 2);
		System.out.println("返回值:" + invoke2);
	}

}

输出:

静态加载
--------成员方法hello()----------
无参构造方法
张三有参方法null
返回值:null
--------私有方法add()----------
无参构造方法
返回值:14

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值