详述反射中属性和普通方法

获取某一个类中的构造方法、属性、普通方法都必须先建立Class对象,再调用方法来获取构造方法、属性、普通方法。
1.属性:
①如何获取属性
(1)Field field = clazz.getField(“name”); 可以获取public级别的,包括继承的父类的public级别的

import java.lang.reflect.Field;

public class Test {
	
	public static void main(String[] args) {
        Class clazz =null;
		clazz = Student.class;
		try {
			Field field = clazz.getField("name");   //name是属性的名字,加引号
			System.out.println(field.getName());
		} catch (Exception e) {
			e.printStackTrace();
		}
	} 
}

(2)Field field1 = clazz.getDeclaredField(“name”); 只能获取本类中的属性,没有权限限制,即使是private也可以获取到。

import java.lang.reflect.Field;

public class Test {
	
	public static void main(String[] args) {
        Class clazz =null;
		clazz = Student.class;
		try {
			Field field1 = clazz.getDeclaredField("name");     //name是属性的名字,加引号
			System.out.println(field.getName());
		} catch (Exception e) {
			e.printStackTrace();
		}
	} 
}

在这里插入图片描述

②通过Field类某些方法可以获取某个成员变量的信息,这些方法如下:
(1)返回Class<?> 对象的实例
getDeclaringClass():返回声明Field对象 表示字段的所在的 类或接口所对应的Class对象。
(2)返回int 类型
getModifiers():以整数形式返回Field对象表示的字段的修饰符。public static等
(3)返回Class<?> 对象的实例
getType():返回Field对象所表示字段的数据类型 所对应的Class对象(推荐)。
(4)返回Type 类型
getGenericType():返回此Field对象所表示字段的声明类型。
(5)返回String类型
getName():返回Field对象表示字段的“名称”。
在Student类创建俩个新的变量
在这里插入图片描述

import java.lang.reflect.Field;

public class Test {
	
	public static void main(String[] args) {
        Class clazz =null;
		clazz = Student.class;
		try {
			Field field = clazz.getField("name");
			System.out.println(field.getName());
			
			Class cla = field.getDeclaringClass();
			System.out.println(cla);
			
			System.out.println(Modifier.toString(field.getModifiers()));
			
			Class claz = field.getType();
			System.out.println(claz.getName());
			
			Field field1 = clazz.getField("name1");
			System.out.println(field1.getGenericType());
			
			Field field2 = clazz.getField("name2");
			System.out.println(field2.getGenericType());
			
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
}	

运行的结果
在这里插入图片描述
③操作属性(赋值和获取属性的值)

import java.lang.reflect.Field;

public class Test {
	
	public static void main(String[] args) {
        Class clazz =null;
		clazz = Student.class;
        try {
			Field field = clazz.getField("name");   //在此代码中,可以理解为field代表name
			System.out.println(field.getName());
			field.setAccessible(true);      //忽略权限,如果name是private也可以在别的类中使用
			Student student = new Student();      //新建一个Student类型对象
			field.set(student, "jim");     //为student 对象的 name赋值jim
			Object object = field.get(student);   //获取student对象的name值
			System.out.println(object);
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
}

运行结果
在这里插入图片描述
2.普通方法
①如何获取普通方法
(1)clazz.getMethods(); 返回一个Method [] 数组;
只能是Student类中的public普通方法,还包括继承自父类的public方法

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class Test {
	
	public static void main(String[] args) {
            Class clazz =null;
			clazz = Student.class;
			try {
			    Method [] methods = clazz.getMethods();   //返回一个数组
			    for( Method method : methods) {
			    	System.out.println(method.getName());
			    }catch (Exception e1) {
						e1.printStackTrace();
				} 
		}
}

运行结果
在这里插入图片描述
(2).getDeclaredMethods();得到的只是“本类”中的普通方法,不包括父类,可以是私有的

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class Test {
	
	public static void main(String[] args) {
            Class clazz =null;
			clazz = Student.class;
				try {
 				Method [] methodz = clazz.getDeclaredMethods(); 
			    for( Method method : methodz) {
			    System.out.println(method.getName());
			    }catch (Exception e1) {
						e1.printStackTrace();
				} 
		}
}

②通过Method类某些方法可以获取某个普通方法的信息,这些方法如下:
(1)返回Class<?>类型
getDeclaringClass():返回声明Method对象表示方法的类或接口的 Class 对象。
(2)返回int类型
getModifiers():以整数形式返回此Method对象所表示方法的修饰符。应该使用Modifier类中的toString方法对所返回的整数进行解码。
(3)返回Class<?> 类型
getReturnType():返回Method对象所表示的方法的返回值类型所对应的Class对象。
(4)返回String 类型
getName():返回方法名。
(5)返回Class<?>[ ] 数组
getParameterTypes():返回由Method对象代表方法的形参类型对应Class对象组成的数组。如果方法没有参数,则数组长度为 0。

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class Test {
	
	public static void main(String[] args) {
			Class clazz =null;
			clazz = Student.class;
				try {
                      Method method = clazz.getDeclaredMethod("doHomework",Integer.TYPE,String.class); 
                      //获取特定某一个方法,先写方法名注意冒号,再写传入方法的参数的类型的Class类
					System.out.println(method.getName());
				
					System.out.println(method.getDeclaringClass());
				
					System.out.println(Modifier.toString(method.getModifiers()));
				
					clazz = method.getReturnType();
					System.out.println(clazz.getName());
				
					Class [] clazzs = method.getParameterTypes();
				
					for(Class zz : clazzs) {
					System.out.println(zz.getName());
					}
				}catch (Exception e1) {
						e1.printStackTrace();
				} 
		}
}

在这里插入图片描述
③如何使用普通方法

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class Test {
	
	public static void main(String[] args) {
			Class clazz =null;
			clazz = Student.class;
				try {
                 Method method = clazz.getDeclaredMethod("doHomework",Integer.TYPE,String.class); 
				 method.setAccessible(true);
				 Object object = method.invoke(new Student(), 1,"tom");
				 System.out.println(object);
		  } catch (Exception e1) {
			e1.printStackTrace();
		} 
	}
}

运行结果
在这里插入图片描述
Student类


public class Student {
	 
	public String name;
	public Integer name1;
	public int name2;
	
	public Student() {
		
	}
	
    public Student(String name) {
		
    	this.name =name;
	}
	
	private int doHomework(int a , String aa) {
		System.out.println("正在写作业。。。");
		return 1;
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值