Java 反射

本文深入介绍了Java反射机制的概念及其作用,包括反编译、访问Java对象的属性、方法及构造方法等内容。文中还提供了三种获取类的方式,并展示了如何通过反射机制实例化对象。

反射的概念:

              主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。

             反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。但是反射使用不当会成本很高


反射机制的作用:

              1,反编译:.class-->.java

              2,通过反射机制访问java对象的属性,方法,构造方法等;

             这样好像更容易理解一些,下边我们具体看怎么实现这些功能

反射机制获取类的几种方式

//第一种方式:
Class c1 = Class.forName("User");
//第二种方式:
//java中每个类型都有class 属性.
Class c2 = User.class;
//第三种方式:
//java语言中任何一个java对象都有getClass 方法
User user= new User();
Class c3 = user.getClass(); //c3是运行时类 (e的运行时类是User)


废话少说直接上代码


测试类

public class UserConstructorReflect {
	public static void main(String[] args) throws NoSuchMethodException,
		SecurityException, InstantiationException,
		IllegalAccessException, IllegalArgumentException, 
		InvocationTargetException {
		// 获取User类型
		Class<?> userClass = User.class;
		// 获取默认构造器
		Constructor<?> constructor = userClass.getConstructor();
		// 获取带int参数的构造器
		Constructor<?> intConstructor = userClass.getConstructor(int.class);
		// 获取带int和String参数的构造器
		Constructor<?> bothConstructor = userClass.getConstructor(int.class,String.class);
		
		// 使用反射,获取新的User对象
		User u1 = (User) constructor.newInstance();
		User u2 = (User) intConstructor.newInstance(1);
		User u3 = (User) bothConstructor.newInstance(2,"BYSocket");
		
		System.out.println(u1.toString());
		System.out.println(u2.toString());
		System.out.println(u3.toString());
	}
}


实体类

public class User {
	private int id;
	private String name;
	
	// 无参构造器(默认构造器)
	public User() {
	}

	public User(int id) {
		this.id = id;
	}

	public User(int id, String name) {
		this.id = id;
		this.name = name;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + "]";
	}
}


获取方法,和构造方法:

方法关键字

含义

getDeclaredMethods()

获取所有的方法

getReturnType()

获得方法的放回类型

getParameterTypes()

获得方法的传入参数类型

getDeclaredMethod("方法名",参数类型.class,……)

获得特定的方法

 

 

构造方法关键字

含义

getDeclaredConstructors()

获取所有的构造方法

getDeclaredConstructor(参数类型.class,……)

获取特定的构造方法

 

 

父类和父接口

含义

getSuperclass()

获取某类的父类

getInterfaces()

获取某类实现的接口




评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值