java -反射机制 了解和使用

本文详细介绍如何使用Java反射机制创建对象并获取类的属性与方法。包括通过不同方式获取类对象,利用反射创建实例,获取并操作类的字段,以及获取方法的详细信息。

首先,先创建一个student类的声明。

package main;

public class Student {
	private Integer id;
	private String name;
	private Integer age;
	private Integer grade;
	
	private Integer getId() {
		return id;
	}
	private void setId(Integer id) {
		this.id = id;
	}
	private String getName() {
		return name;
	}
	private void setName(String name) {
		this.name = name;
	}
	private Integer getAge() {
		return age;
	}
	private void setAge(Integer age) {
		this.age = age;
	}
	private Integer getGrade() {
		return grade;
	}
	private void setGrade(Integer grade) {
		this.grade = grade;
	}
}

 然后,开始 写主函数,使用反射机制 创建student类,得到成员和方法。

package main;

import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;

public class Main {

	public static void main (String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException, NoSuchMethodException
	{
		//System.out.println("hello world!");
	//1.获取类有三种方式来:  c1;c2;c3。
		//第一种方式  
		 Class<?> c1=Class.forName("main.Student");
		 
		 //第二种方式:java中每个类型都有class 属性.
		 Class c2 = Student.class;
		 
		 //第三种方式:java语言中任何一个java对象都有getClass 方法
		 Student u = new Student();  
		 Class c3 = u.getClass(); //c3是运行时类 (e的运行时类是User)  
		 
		 Class<?> c=c1;
	//2.创建对象方法
		//创建此Class 对象所表示的类的一个新实例  
		 Object o = c.newInstance(); //调用了User的无参数构造方法.  
	//3.获取类的属性
         //a.获取所有属性修饰符、属性名
	         Field[] fs = c.getDeclaredFields(); 
	         //定义可变长的字符串来存储属性
	         StringBuilder sBuilder=new StringBuilder();
	         //通过追加的方法,将每个属性拼接到此字符串中  
	         //最外边的public定义  
	         sBuilder.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");
	         //里边的每一个属性  
	         for(Field field:fs){  
	        	 sBuilder.append("\t");//空格  
	        	 sBuilder.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等  
	        	 sBuilder.append(field.getType().getSimpleName() + " ");//属性的类型的名字  
	        	 sBuilder.append(field.getName()+";\n");//属性的名字+回车  
	         }  
	         sBuilder.append("}");  
	         //输出 属性
	         System.out.println(sBuilder);
         //b.获取特定属性并赋值
	         //获取id属性
	         Field fieldId=c.getDeclaredField("id");
	         Field fieldName=c.getDeclaredField("name");    
	         //实例化这个类赋给temp  
	         Object temp = c.newInstance();
	         //打破封装  
	         fieldId.setAccessible(true); //使用反射机制可以打破封装性,导致了java对象的属性不安全。  
	         fieldName.setAccessible(true); //使用反射机制可以打破封装性,导致了java对象的属性不安全。  
	         //set	给temp对象的id属性赋值"110"  
	         fieldId.set(temp, 110);   
	         fieldName.set(temp, "Martin");   

	         //get  
	         System.out.println(fieldId.get(temp));  
	         System.out.println(fieldName.get(temp));
     //4.获取类的方法
         //获得类的修饰符,方法名,入参信息,出参信息
	     Method method =c.getDeclaredMethod("setId",java.lang.Integer.class);
	     StringBuilder sBuilder2=new StringBuilder();
	     int modifiers=method.getModifiers();
	     String name=method.getName();
	     String paraType="( ";
	     Class<?>[] parameterTypes = method.getParameterTypes(); //获得参数类型
         Type[] genericParameterTypes = method.getGenericParameterTypes();
         for (int i = 0; i <= parameterTypes.length; i++) {
        	 if(i==0)
        		 paraType+=genericParameterTypes[i];
        	 else if(i==parameterTypes.length)
        	 {
        		 paraType+=");\n";
        		 break;
        	 }
        	 else
        		 paraType+=","+genericParameterTypes[i];
         } 
         sBuilder2.append(Modifier.toString(modifiers));
         sBuilder2.append(" "+name);
         sBuilder2.append(paraType);
         System.out.println("\n"+sBuilder2);
	}
}

运行结果截图:

 

 

补充:个人博客地址:www.yeds.site

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值