Java 反射(构造方法) 相当暴力啊 暴力反射

本文探讨了Java反射中的newInstance()方法,揭示了其如何通过动态创建对象来展现强大的能力。通过对数据bean的实例化过程分析,展示了反射在编程中的暴力一面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >




数据bean:

package com.mth.bean;

public class Person {

	private String name;
	private int age;

	private Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public Person() {
		super();

		System.out.println("空参构造方法");
	}

	public Person(int x) {
		super();
		System.out.println("int 参数的构造方法!"+x);
	}

	public void say() {
		System.out.println("public.............say");
	}

	public void run() {

		System.out.println("public..........run");
	}

	private void think() {
		System.out.println("private.......think");

	}

	@Override
	public String toString() {
		return name + "......" + age;
	}

}
三种获取class文件对象的方式:

package com.mth.test;

import com.mth.bean.Person;

/*
 * 获取person.class字节文件对象
 * 
 * */
public class ReflectDemo {

	public static void main(String[] args) {
		// 第一种方法:通过对象获取
		Person p = new Person();
		Class c1 = p.getClass();
		System.out.println(c1);

		// 第二种方法:通过类的静态属性来获取
		Class c2 = Person.class;
		System.out.println(c2);

		System.out.println(c1 == c2);// true
		System.out.println(c1.equals(c2));// true

		// 第三种方法:通过Class类的静态方法 forName
		// "Person" 如果定义了包名 包名.类名
		try {
			Class c3 = Class.forName("com.mth.bean.Person");
			System.out.println(c3);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

从字节码文件对象中获取构造方法,并运行 步骤:
     A 获取字节码文件对象
     B 通过字节码文件对象,获取构造方法
        getConstructors()返回数组,所有的公共的
getDeclaredConstructors()返回数组,所有的,包含私有的
getConstructor()返回一个构造,公共的
getConstructor(可变参数)
getDeclaredConstructor()返回一个,私有的

     C 通过newInstance()方法,建立对象

package com.mth.test;

import java.lang.reflect.Constructor;

import com.mth.bean.Person;

/*
 * 获取构造方法 并运行
 * 
 * */
public class ReflectDemo1 {

	public static void main(String[] args) throws ClassNotFoundException,
			Exception, Exception {
		Class clazz = Class.forName("com.mth.bean.Person");

		// Constructor<?>[] getConstructors() 返回一个包含某些 Constructor 对象的数组
		// 反映此 Class 对象所表示的类的所有公共(public)构造方法。
		// 获取到的都是公有的构造方法
		Constructor[] array = clazz.getConstructors();
		for (Constructor c : array) {
			System.out.println(c);
		}
		// getDeclaredConstructors() 获取当前类的所有构造方法
		Constructor[] array1 = clazz.getDeclaredConstructors();
		for (Constructor c : array1) {
			System.out.println(c);
		}

		// 获取空参数的一个构造方法
		// getConstructor() 获取一个构造方法 (只能通过参数列表来区分)
		Constructor con = clazz.getConstructor();
		System.out.println("只获取空参构造....." + con);

		// 如何运行构造方法呢?
		// 创建实例
		Person p1 = (Person) con.newInstance();
		System.out.println(p1);// 结果null......0

		// 获取int参数的构造函数getConstructor(参数..类)
		Constructor con1 = clazz.getConstructor(int.class);
		System.out.println("获取int参数的构造函数....." + con1);
		con1.newInstance(19);

		// 获取私有的构造方法 并运行
		// getDeclaredConstructor()获取私有的构造
		Constructor con2 = clazz
				.getDeclaredConstructor(String.class, int.class);
		System.out.println(con2);
		// 如何运行呢?
		// Constructor 父类AccessibleObject当中 void setAccessible(boolean flag) 方法
		con2.setAccessible(true);
		Person p2 = (Person) con2.newInstance("zhangsan", 20);
		System.out.println(p2);

		// 不获取构造方法直接创建对象
		// T newInstance() 创建此 Class 对象所表示的类的一个新实例。
		// 适合有空参构造 并且权限是public的可以直接通过newInstance()创建对象
		Class clazz2 = Class.forName("com.mth.bean.Person");
		Person p3 = (Person) clazz2.newInstance();
		System.out.println("直接创建对象  不通过构造..." + p3);
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值