欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

javaSE基础语法--反射

程序员文章站 2022-06-28 20:19:15
认识反射13.1.反射是什么,有什么作用?反射—在程序运行的过程中,我们可以得到某个类的对象,可以调用某个类中的任何一个变量/方法,这种动态获取信息的过程就是反射。当我们在没有见过某个类的情况下,仅凭一个完整的类名,就可以获取到整个类的所有信息。反射的使用场景:jdbc加载数据库驱动Servlet的web.xml配置Spring框架13.2.实例对象与反射对象的相互转换?实例对象-----就是我们通过类创建的对象反射对象-----通过反射机制得到的类对象例如: 反射就是一面镜子,...

认识反射

13.1.反射是什么,有什么作用?
反射—在程序运行的过程中,我们可以得到某个类的对象,可以调用某个类中的任何一个变量/方法,这种动态获取信息的过程就是反射。
当我们在没有见过某个类的情况下,仅凭一个完整的类名,就可以获取到整个类的所有信息。
反射的使用场景:

  1. jdbc加载数据库驱动
  2. Servlet的web.xml配置
  3. Spring框架

13.2.实例对象与反射对象的相互转换?
实例对象-----就是我们通过类创建的对象
反射对象-----通过反射机制得到的类对象
例如: 反射就是一面镜子,镜子前面的你就是实例对象,通过镜子得到的镜子里面的你就是反射对象。

反射对象是一个Class类型的对象
Class—不是创建类的关键字,表示一个类,所以反射对象是一个Class类型的对象

public final class Class
1. 通过实例对象得到反射对象

package com.wangxing.test4;

public class Student {

	public void shili(){
		System.out.println("student的实例对象");
	}
}

测试反射:

package com.wangxing.test4;

public class TestMain {

	public static void main(String[] args)throws Exception {
		//得到反射对象
		//1.通过实例对象的带反射对象
		Student stu=new Student();
		Class stuclass=stu.getClass();
		//通过Class类的forname(类名【包+类名】)
		Class stuClass2=Class.forName("com.wangxing.test4.Student");
		
   }

}

2. 通过反射对象得到实例对象

package com.wangxing.test4;

public class TestMain {

	public static void main(String[] args)throws Exception {	
		//通过反射对象得到实例对象
		Class stuClass2=Class.forName("com.wangxing.test4.Student");
		Student stu=(Student) stuClass2.newInstance();
		stu.shili();
   }

}

13.3.通过反射对象得到构造方法\成员变量\成员方法

Constructor<?>[]    getConstructors() 得到构造方法
Field[]             getDeclaredFields() 得到成员变量
Method[]	        getDeclaredMethods() 得到成员方法
Class<?>[]	        getInterfaces() 得到接口。 
Class<? super T>    getSuperclass() 得到父类。
Package	            getPackage() 得到包对象。
int  	            getModifiers() Java语言修饰符
                    Modifier的toString(int mod)
String              getName() 得到类名称

例如:
接口:

package com.wangxing.test4;

public interface MytestInterface {

}

父类:

package com.wangxing.test4;

public class Person {

}

Student类

package com.wangxing.test4;

//继承person类实现MytestInterface接口
public class Student extends Person implements MytestInterface {
	//私有变量
	private String name;
	private int age;
	//无参构造方法
	public Student(){
			
	}
	//带参构造方法
	public Student(String name){
		this.name=name;
	}
	public void shili(){
		System.out.println("student的实例对象");
	}
}

测试类:

package com.wangxing.test4;

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


public class TestMain2 {
	public static String testname(String classname){
//		classname.substring(classname.lastIndexOf(".")+1);
		return classname.substring(classname.lastIndexOf(".")+1);
	}
	public static void main(String[] args)throws Exception {
		/*
		 * Constructor<?>[]    getConstructors() 得到构造方法
		 * Field[]             getDeclaredFields() 得到成员变量
		 * Method[]	        getDeclaredMethods() 得到成员方法
		 * Class<?>[]	        getInterfaces() 得到接口。 
		 * Class<? super T>    getSuperclass() 得到父类。
		 * Package	            getPackage() 得到包对象。
		 * int  	            getModifiers() Java语言修饰符
                    Modifier的toString(int mod)
         *String              getName() 得到类名称
		 */
		//反射对象
		Class stuclass=Class.forName("com.wangxing.test4.Student");
		//得到包名
		String pagename=stuclass.getPackage().getName();
		String stringinfo="package "+pagename+";";
		System.out.println(stringinfo);
		//得到类的信息
		//修饰信息
		String classxiushi=Modifier.toString(stuclass.getModifiers());
		//得到类名
		String leiming=testname(stuclass.getName());
		//得到父类名
		String supername=testname(stuclass.getSuperclass().getName());
		//得到接口名
		StringBuilder interinfo=new StringBuilder();
		Class interfacearr[]=stuclass.getInterfaces();
			for(Class inter:interfacearr){
				String intername=testname(inter.getName());
				interinfo.append(intername+",");
			}  
			interinfo.deleteCharAt(interinfo.length()-1);
			//转string	
//		System.out.println(interinfo.toString());
		String classinfo=classxiushi+" class "+leiming+" extends "+supername+" implements "+interinfo.toString()+" {";
		System.out.println(classinfo);
		
		//得到成员变量
		Field fieldarr[]=stuclass.getDeclaredFields();
		for(Field chengyuan:fieldarr){
			//成员修饰
			String chengyuanxiushifu=Modifier.toString(chengyuan.getModifiers());
			//数据类型
			String chengyuanleixing=testname(chengyuan.getType().getName());
			//成员变量名称
			String chengyuanname=chengyuan.getName();
			String chengyuaninfo=chengyuanxiushifu+" "+chengyuanleixing+" "+chengyuanname+";";
			System.out.println("\t"+chengyuaninfo);
		}
	    //得到类中的构造方法
		Constructor Constructorarr[]=stuclass.getConstructors();
		for(Constructor gzff:Constructorarr){
			//构造方法修饰
			String gzffxiushi=Modifier.toString(gzff.getModifiers());
			//构造方法名
			String gzffname=gzff.getName();
			StringBuilder canshu=new StringBuilder();
			//参数类型
			Class conptype[]=gzff.getParameterTypes();
			if(conptype.length!=0){
			for(Class typeclass:conptype){
				String typename=testname(typeclass.getName());
				canshu.append(typename+" name,");
			}
			canshu.deleteCharAt(canshu.length()-1);
			}
			String gzffinfo=gzffxiushi+" "+gzffname+"("+canshu.toString()+"){}";
			System.out.println("\t"+gzffinfo);
		}
		//得到实例方法
		Method  methodarr[]=stuclass.getDeclaredMethods();
		for(Method  meth:methodarr){
			String mothxiu=Modifier.toString(meth.getModifiers());
			String tereturn=testname(meth.getReturnType().getName());
			String methname=meth.getName();
			StringBuilder  canshu=new StringBuilder();
			Class mathodptype[]=meth.getParameterTypes();
			if(mathodptype.length!=0){
			for(Class  typeclass:mathodptype){
				String typename=testname(typeclass.getName());
				canshu.append(typename+" args,");
			}
			canshu.deleteCharAt(canshu.length()-1);
			}
			String methodinfo=mothxiu+" "+tereturn+" "+methname+"("+canshu.toString()+"){}";
			System.out.println("\t"+methodinfo);
		}
		System.out.println("}");
		
   }

}

本文地址:https://blog.csdn.net/sinat_50855580/article/details/112675563