认识反射

认识反射

13.1.反射是什么,有什么作用?

     反射---在程序运行的过程中,我们可以得到某个类的对象,可以调用某个类中的任何一个变量/方法,这种动态获取信息的过程就是反射。当我们在没有见过某个类的情况下,仅凭一个完整的

类名,就可以获取到整个类的所有信息。

     反射的使用场景:

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

13.2.实例对象与反射对象的相互转换?

     实例对象-----就是我们通过类创建的对象

     反射对象-----通过反射机制得到的类对象

     例如:  反射就是一面镜子,镜子前面的你就是实例对象,通过镜子得到的镜子里面的你就是反射对象。

     反射对象是一个Class类型的对象

     Class---不是创建类的关键字,表示一个类,所以反射对象是一个Class类型的对象        public final class Class<T

package com.wangxing.test1;

public class TestMain {

	public static void main(String[] args) {
		/*
		//得到反射对象
		//1.通过实例对象得到反射对象  [getClass()]
		Student stu=new Student();
		Class  stuclass=stu.getClass();
		//2通过Class类的forname(类名【包名+类名】)
		try {
			Class  stuclass2=Class.forName("com.wangxing.test1.Student");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		*/
		
		//通过反射对象得到实例对象 [newInstance()]
		//Student stu=new Student();
		//stu.test1();
		try {
			Class  stuclass2=Class.forName("com.wangxing.test1.Student");
			Student  stu=(Student)stuclass2.newInstance();
			stu.test1();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

}

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() 得到类名称

13.4反射的应用

       父类:

package com.wangxing.test1;

public class Person {

}

       接口:

package com.wangxing.test1;

public interface MyTestInterface {

}

      子类且实现接口:

package com.wangxing.test1;
public class Student extends Person implements MyTestInterface{
	private  String  stuname;
	private  int  stuage;
	public  Student(){}
	public  Student(String name){
		this.stuname=name;
	}
	public  void  test1(){
		System.out.println("Student类的实例方法");
	}
	public  String  testString(String args){
		return "hello";
	}
}

        通过反射得到类中的变量和方法:

package com.wangxing.test1;

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

//通过反射得到与Student类一样的java类
public class TestMain2 {
	public static String  testName(String classname){
		return classname.substring(classname.lastIndexOf(".")+1);
	}
	public static void main(String[] args)throws Exception {
		Class  stuclass2=Class.forName("com.wangxing.test1.Student");
		//得到Student类的包名
		String  pagename=stuclass2.getPackage().getName();
		String packageinfo="package "+pagename+";";
		System.out.println(packageinfo);
		//得到Student类的定义信息
		String classxiushifu=Modifier.toString(stuclass2.getModifiers());
		String leiming=testName(stuclass2.getName());
		String supername=testName(stuclass2.getSuperclass().getName());
		Class interfacearr[]=stuclass2.getInterfaces();
		StringBuilder interinfo=new  StringBuilder();
		for(Class inter:interfacearr){
			String intername=testName(inter.getName());
			interinfo.append(intername+",");
		}
		interinfo.deleteCharAt(interinfo.length()-1);
		String classinfo=classxiushifu+" class "+leiming+" extends "+
		supername+" implements "+interinfo.toString()+"{";
		System.out.println(classinfo);
		//得到类中的成员变量
		Field fieldarr[]=stuclass2.getDeclaredFields();
		for(Field  field:fieldarr){
			String fieldxiu=Modifier.toString(field.getModifiers());
			String fieldleixing=testName(field.getType().getName());
			String fieldname=field.getName();
			String fieldinfo=fieldxiu+" "+fieldleixing+" "+fieldname+";";
			System.out.println("\t"+fieldinfo);
		}
		//得到类中的构造方法
		Constructor constructorarr[]=stuclass2.getConstructors();
		for(Constructor con:constructorarr){
			String conxiu=Modifier.toString(con.getModifiers());
			String conname=testName(con.getName());
			StringBuilder  canshu=new StringBuilder();
			Class conptype[]=con.getParameterTypes();
			if(conptype.length!=0){
			for(Class  typeclass:conptype){
				String typename=testName(typeclass.getName());
				canshu.append(typename+" name,");
			}
			canshu.deleteCharAt(canshu.length()-1);
			}
			String  coninfo=conxiu+" "+conname+"("+canshu.toString()+"){}";
			System.out.println("\t"+coninfo);
		 }
		//得到实例方法
		Method  methodarr[]=stuclass2.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("}");
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值