java反射

本文介绍了Java反射机制的基本概念及其核心功能,包括动态获取类信息、创建对象及调用方法等,并通过多个实例展示了如何使用Class类进行反射操作。

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

反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能:

  • 在运行时判断任意一个对象所属的类;
  • 在运行时构造任意一个类的对象;
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时调用任意一个对象的方法;
  • 生成动态代理
    举例:
  //  1. 动态获知程序的运行位置
  String path = Test.class.getResource("/").getPath();
  //  2. 加载数据库驱动
    Class.forName("com.icss.biz.Connection");
	System.out.println("com.icss.biz.Connection加载成功");
//  3. 动态创建对象
	//  Spring动态创建bean对象      
//4.动态调用对象的方法
	//动态代理

一、 Class类

Class类的实例表示正在运行的 Java 应用程序中的类和接口。
1、获取Class类型的三种方式:

			 (1). 类型.class 
             (2). 对象.getClass()
             (3) Class.forName()
             (4). //Class aa = new Class();   类没有公共构造函数,不能使用new创建Class

2、Class中的常用方法:

注意:Dog类适用于以下任何例子

public class Dog {
private String name;
private int health;
protected int age;
public int weigth;

public int getAge() {
	return age;
}

public void setAge(int age) {
	this.age = age;
}

public int getWeigth() {
	return weigth;
}

public void setWeigth(int weigth) {
	this.weigth = weigth;
}

public String getName() {
	return name;
}

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

public int getHealth() {
	return health;
}

public void setHealth(int health) {
	this.health = health;
}

public Dog() {
	
}
public Dog(String name) {
	this.name=name;
}
public void  swim() {
	
	System.out.println(this.name+"is swiming");
}
public void dis(int pool) {
	System.out.println("this pool is" +pool);
}
}

T newInstance()
创建由此 类对象表示的类的新实例。

public static void createDog() {
	Class c= Dog.class;
	try {
	Dog obj=(Dog)c.newInstance();//动态创建对象
	obj.setName("旺财");
	obj.swim();
	} catch (InstantiationException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (IllegalAccessException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}
public static void main(String[] args) {
	createDog();
}

执行结果:

旺财is swiming

Constructor getDeclaredConstructor(类<?>… parameterTypes)
返回一个 Constructor对象,该对象反映 Constructor对象表示的类或接口的指定 类函数
例如:

public static void create2() {
	Class c=Dog.class;
	try {
		Dog dog=(Dog)c.getDeclaredConstructor(String.class).newInstance("欢欢");
		dog.swim();
		
	} catch (Exception e) {
		// TODO: handle exception
	}
	
}
public static void main(String[] args) {
	create2();
}

执行结果:

欢欢is swiming

class.getResource("/").getPath();
动态获得路径

public static void getPath() {
		Class class1=Dog.class;
	String string=class1.getResource("/").getPath();//动态获得路径
		System.out.println(string);
}
public static void main(String[] args) {
	getPath();
}

执行结果:

/F:/eclipse-workspace/Test3-27/bin/

Field[] getFields()
返回包含一个数组 Field对象反射由此表示的类或接口的所有可访问的公共字段、类对象。
Field[] getDeclaredFields()
动态的返回的数组 Field对象反映此表示的类或接口声明的所有字段 类对象

例如:

public static void getFileds() {
	Class class1=Dog.class;
	Field[]  fields= class1.getFields();
	System.out.println("类的public属性:");
	for(Field f:fields) {
		System.out.println(f.getName());
	}
	Field[]  fields1= class1.getDeclaredFields();//动态获取所有属性
	System.out.println("类的所有属性:");
	for(Field f:fields1) {
		System.out.println(f.getName());
	}
	public static void main(String[] args) {
	getFileds();

}
}

执行结果:

类的public属性:
weigth
类的所有属性:
name
health
age
weigth

方法[] getMethods()
返回包含一个数组 方法对象反射由此表示的类或接口的所有公共方法 类对象,包括那些由类或接口和那些从超类和超接口继承的声明。
方法[] getDeclaredMethods()
返回包含一个数组 方法对象反射的类或接口的所有声明的方法,通过此表示 类对象,包括公共,保护,默认(包)访问和私有方法,但不包括继承的方法。

public static void getMethonds() {
	Class class1=Dog.class;
	Method[] methods=class1.getMethods();
	System.out.println("类的public方法");
	for(Method m:methods) {
		System.out.println(m.getName());
	}
	Method[] methods1=class1.getDeclaredMethods();
	System.out.println("类的所有方法");
	for(Method m:methods1) {
		System.out.println(m.getName());
	}
}
public static void main(String[] args) {
	getMethonds();
}

执行结果:

类的public方法
getName
setName
setWeigth
dis
getAge
getHealth
setAge
getWeigth
setHealth
swim
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll
类的所有方法
getName
setName
setWeigth
dis
getAge
getHealth
setAge
getWeigth
setHealth
swim

Object invoke(Object obj, Object… args)
在具有指定参数的 方法对象上调用此 方法对象表示的底层方法

public static void invokeMethod() {
 	Class class1= Dog.class;
 	try {
 	Object obj=class1.getDeclaredConstructor(String.class).newInstance("大黄");	
	Method[] ms = class1.getDeclaredMethods();
	for(Method m:ms) {
		if(m.getName().equals("swim")) {
			m.invoke(obj);
		}if(m.getName().equals("dis")) {
			m.invoke(obj, 5);
		}
	}
 	} catch (Exception e) {
		// TODO: handle exception
	}
 	
}
public static void main(String[] args) {
invokeMethod();
}

执行结果:

this pool is5
大黄is swiming

注意: getFields和getDeclaredFields区别:

getFields返回的是声明为public的属性,包括父类中定义 。 getDeclaredFields返回的是指定类定义的所有定义的属性,不包括父类的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值