Java反射的基本应用

Posted 听风者-better

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java反射的基本应用相关的知识,希望对你有一定的参考价值。

Java反射的基本应用

参考文章:

https://blog.csdn.net/sinat_38259539/article/details/71799078

https://blog.csdn.net/a745233700/article/details/82893076

一.反射机制概述

​ JAVA反射机制是在运行状态中,对于任意一个类,能够获取这个类的所有属性和方法,对于任意一个对象,能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

总结:反射就是把java类中的各种成分映射成一个个的Java对象

二、反射的优缺点

  1. 优点:
    1. 使用反射,我们就可以在运行时获得类的各种内容,进行反编译,对于Java这种先编译再运行的语言,能够让我们很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象。
  2. 缺点:
    1. 反射会消耗一定的系统资源,因此,如果不需要动态地创建一个对象,那么就不需要用反射。
    2. 反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题。

三、反射的基本使用

  1. class

    package com.twy.test;
    
    import java.lang.reflect.Constructor;
    
    import com.twy.entity.User;
    
    public class ClassTest 
    	public static void main(String[] args) throws Exception 
    		//一.获取class类
    		User u1 = new User();//已经
    		Class<?> c1 = u1.getClass();
    		System.out.println(c1.getName());
    		
    		Class<?> c2 = User.class;
    		System.out.println(c2.getName());
    		
    		//常用方法
    		try 
    			Class<?> c3 = Class.forName("com.twy.entity.User");
    			System.out.println(c3.getName());
    		 catch (ClassNotFoundException e) 
    			e.printStackTrace();
    		
    		
    		//二.创建实例
    		//1.使用Class对象的newInstance()方法
    		Class<?> c = User.class;
    		Object o1 = c.newInstance();
    		System.out.println(o1);
    		
    		//2.通过Class对象获取指定的Constructor构造器对象,根据构造器创建实例
    		Constructor<?> constructor= c.getConstructor();
    		Object o2 = constructor.newInstance();
    		System.out.println(o2);
    				
    	
    
    

    User类:

    package com.twy.entity;
    
    public class User 
    	public Integer id;
    	private String name;
    	private int age;
    	private boolean login;
    
    	public User() 
    
    	
    
    	public User(int id) 
    		super();
    		this.id = id;
    	
    
    	private User(String name) 
    		super();
    		this.name = name;
    	
    
    	private User(String name, int age, boolean login) 
    		super();
    		this.name = name;
    		this.age = age;
    		this.login = login;
    	
    
    	public User(int id, String name, int age, boolean login) 
    		super();
    		this.id = id;
    		this.name = name;
    		this.age = age;
    		this.login = login;
    	
    
    	public void test(int id, String name) 
    		System.out.println("test方法被调用");
    	
    
    	private void add() 
    		System.out.println("add方法被调用");
    	
    
    	public Integer getId() 
    		return id;
    	
    
    	public void setId(Integer 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 boolean isLogin() 
    		return login;
    	
    
    	public void setLogin(boolean login) 
    		this.login = login;
    	
    
    
    
  2. method

    package com.twy.test;
    
    import java.lang.reflect.Method;
    
    public class MethodTest 
    	public static void main(String[] args) throws Exception 
    		Class<?> clazz = Class.forName("com.twy.entity.User");
    		//获取公有方法包括父类
    		Method[] mArr1 = clazz.getMethods();
    		for(Method m: mArr1) 
    			System.out.println(m);
    		
    		
    		//获取所有方法包含私有方法
    		Method[] mArr2 = clazz.getDeclaredMethods();
    		for(Method m: mArr2) 
    			System.out.println(m);
    		
    		
    		//获取单个公有方法
    		Method m = clazz.getMethod("test", int.class,String.class);
    		System.out.println(m);
    		Object obj = clazz.newInstance();
    		m.invoke(obj, 1,"测试");
    		
    		//获取单个方法包含私有方法
    		Method pm = clazz.getDeclaredMethod("add");
    		System.out.println(pm);
    		Object obj2 = clazz.newInstance();
    		pm.setAccessible(true);
    		pm.invoke(obj2);
    		
    	
    	
    
    
  3. filed

    package com.twy.test;
    
    import java.lang.reflect.Field;
    
    import com.twy.entity.User;
    
    
    public class FieldTest 
    	public static void main(String[] args) throws Exception 
    		Class<?> clazz = Class.forName("com.twy.entity.User");
    		
    		//获取所有公有字段
    		Field[] fArr = clazz.getFields();
    		for(Field f : fArr) 
    			System.out.println(f);
    		
    		
    		//获取所有字段包含私有字段
    		Field[] fArr2 = clazz.getDeclaredFields();
    		for(Field f : fArr2) 
    			System.out.println(f);
    		
    		
    		//获取单个公有字段
    		Field f = clazz.getField("id");
    		Object obj = clazz.newInstance();
    		f.set(obj, 1);
    		System.out.println(((User) obj).getId());
    		
    		//获取单个字段包含私有字段
    		Field pf = clazz.getDeclaredField("name");
    		Object obj2 = clazz.newInstance();
    		pf.setAccessible(true);
    		pf.set(obj2, "测试");
    		System.out.println(((User) obj2).getName());
    	
    
    
    
  4. 通过反射调用set/get方法

    package com.twy.test;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    import com.twy.entity.User;
    
    public class ReflectUtil 
    
    	public static Object getMethod(Object obj, String args) throws Exception 
    		Class<?> clazz = obj.getClass();
    		Field field = clazz.getDeclaredField(args);
    		if (field == null) 
    			return null;
    		
    		String fieldName = "get" + args.substring(0, 1).toUpperCase() + (args.length() > 1 ? args.substring(1) : "");
    		Method m = clazz.getDeclaredMethod(fieldName);
    		return m.invoke(obj);
    	
    
    	public static void setMethod(Object obj, String args, Object value) throws Exception 
    		Class<?> clazz = obj.getClass();
    		Field field = clazz.getDeclaredField(args);
    		if (field == null) 
    			return;
    		
    		String fieldName = "set" + args.substring(0, 1).toUpperCase() + (args.length() > 1 ? args.substring(1) : "");
    		Method m = clazz.getDeclaredMethod(fieldName,value.getClass());
    		m.invoke(obj, value);
    	
    
    	public static void main(String[] args) 
    		User user = new User();
    		try 
    			int a = 1;
    			ReflectUtil.setMethod(user, "id", a);
    			int id = (int) ReflectUtil.getMethod(user, "id");
    			ReflectUtil.setMethod(user, "name", "哈哈哈");
    			String name = (String) ReflectUtil.getMethod(user, "name");
    			System.out.println(id);
    			System.out.println(name);
    		 catch (Exception e) 
    			e.printStackTrace();
    		
    	
    
    

以上是关于Java反射的基本应用的主要内容,如果未能解决你的问题,请参考以下文章

Java反射和注解基础

Java 反射是什么?

Java反射机制深入详解

Linux OpenGL 实践篇-6 光照

java 中反射机制和内省机制的区别是啥?

java反射初探