java反射的使用

1、新建个实体类

// An highlighted block
package test.reflect;
public class Student {
	private int id;
	public String name;
	private int age;
	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;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Student(){}
	
	public Student(String name){
		this.name = name;
	}
	public void print(){
		System.out.println("id:"+this.id+"--name:"+this.name+"--age:"+this.age);
	}
}

2、通过反射获取类的信息

// An highlighted block
package test.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 反射获取类信息
 *
 */
public class demo01 {
	public static void main(String[] args) {
		String path = "test.reflect.Student";
		try{
			Class clazz = Class.forName(path);
			System.out.println("包名+类名:"+clazz.getName());//类的包名+类名
			System.out.println("类名:"+clazz.getSimpleName());//类名
			//获取属性信息
			Field[] field = clazz.getFields();//获取public修饰属性
			Field[] fields = clazz.getDeclaredFields();//获取所有属性
			Field fieldid = clazz.getDeclaredField("id");//获取指定属性
			for(Field f : field){
				System.out.println("public属性:"+f.getName());
			}
			for(Field f : fields){
				System.out.println("所有属性:"+f.getName());
			}
			System.out.println("指定属性:"+fieldid);
			
			//获取方法信息
			Method[] methods = clazz.getDeclaredMethods();
			
			for(Method mm:methods){
				System.out.println("所有方法:"+mm);
			}
			Method m = clazz.getDeclaredMethod("getId", null);
			System.out.println("指定方法:"+m);
			
			//获取构造器
			Constructor[]  constructors = clazz.getDeclaredConstructors();
			for(Constructor c : constructors){
				System.out.println("所有构造器:"+c);
			}
			
			Constructor c1 = clazz.getDeclaredConstructor(String.class);
			System.out.println("带参构造器:"+c1);
			
			Constructor c2 = clazz.getDeclaredConstructor(null);
			System.out.println("无参构造器:"+c2);
		}catch(Exception e){
			
		}
	}
}
包名+类名:test.reflect.Student
类名:Student
public属性:name
所有属性:id
所有属性:name
所有属性:age
指定属性:private int test.reflect.Student.id
所有方法:public void test.reflect.Student.setId(int)
所有方法:public int test.reflect.Student.getAge()
所有方法:public void test.reflect.Student.setAge(int)
所有方法:public java.lang.String test.reflect.Student.getName()
所有方法:public int test.reflect.Student.getId()
所有方法:public void test.reflect.Student.setName(java.lang.String)
所有方法:public void test.reflect.Student.print()
指定方法:public int test.reflect.Student.getId()
所有构造器:public test.reflect.Student()
所有构造器:public test.reflect.Student(java.lang.String)
带参构造器:public test.reflect.Student(java.lang.String)
无参构造器:public test.reflect.Student()

3、通过反射操作类

// An highlighted block
package test.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
 * 反射调用方法操作类
 *
 */
public class demo02 {
	public static void main(String[] args) {
		String path = "test.reflect.Student";
		try {
			Class clazz = Class.forName(path);
			Student student = (Student) clazz.newInstance();//调用无参构造器
			System.out.println(student.hashCode());
			通过反射调用构造方法
			Constructor c1 = clazz.getDeclaredConstructor(String.class);
			Student s2 = (Student) c1.newInstance("周星星");
			System.out.println(s2.getName());
			System.out.println("==========================");
			//通过反射调用普通方法
			Student s3 = (Student) clazz.newInstance();
			Method method = clazz.getDeclaredMethod("setId", int.class);
			method.invoke(s3, 100);
			System.out.println(s3.getId());
			System.out.println("==========================");
			//通过反射操作属性
			Student s4 = (Student) clazz.newInstance();
			Field f1 = clazz.getDeclaredField("age");
			Field f2 = clazz.getDeclaredField("id");
			Field f3 = clazz.getDeclaredField("name");
			f1.setAccessible(true);
			f2.setAccessible(true);
			f3.setAccessible(true);
			f1.set(s4, 20);
			f2.set(s4, 1);
			f3.set(s4, "张无忌");
			s4.print();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}
21174459
周星星
==========================
100
==========================
id:1--name:张无忌--age:20

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java反射可以让我们在运行时获取和操作类的信息,包括类的属性、方法、构造函数等。下面是一个使用Java反射的简单案例: 假设我们有一个类Person: ```java public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public void sayHello() { System.out.println("Hello, my name is " + name + ", I am " + age + " years old."); } } ``` 现在,我们可以使用反射来获取和调用Person类的构造函数和方法: ```java import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class ReflectionExample { public static void main(String[] args) throws Exception { // 获取Person类的Class对象 Class<Person> personClass = Person.class; // 获取Person类的构造函数 Constructor<Person> constructor = personClass.getConstructor(String.class, int.class); // 使用构造函数创建Person对象 Person person = constructor.newInstance("Tom", 20); // 获取Person类的sayHello方法 Method sayHelloMethod = personClass.getMethod("sayHello"); // 调用sayHello方法 sayHelloMethod.invoke(person); } } ``` 以上代码中,我们首先通过`Person.class`获取了Person类的Class对象,然后使用`getConstructor`方法获取了Person类的构造函数,并使用构造函数创建了一个Person对象。接着,我们使用`getMethod`方法获取了Person类的`sayHello`方法,并使用`invoke`方法调用了该方法。最终,我们输出了`Hello, my name is Tom, I am 20 years old.`。 这只是一个简单的反射案例,实际上Java反射还可以做很多其他的事情,比如动态代理、注解处理等等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值