反射是什么?

什么是反射?

反射是框架的灵魂,.java-.Class 是编译,而反射是从.Class-.java 的过程 就是去获取一个类里面的对象对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。

反射时,可以获取类里面的,类的对象,Field(属性),Method类(方法),构造方法等......

在这里可以举个例子:获取Field(属性),Method类(方法)相对来说这两个重要

这个是我们要用到的类,叫Person

package com.Zking.xml;

public class Person {
  private int pid;
  private   String pname;
  private int page;
 
public Person() {
	super();
	// TODO Auto-generated constructor stub
}

//四大方法
//有参有返回
public String m4(Integer pid,String pname,Integer page) {
	 return pid +pname+page;
}
//有参无返回
public void m3(Integer pid,String pname,Integer page) {
	 System.out.println(pid);
	 System.out.println(pname);
	 System.out.println(page);
}
//无参无返回
public void m1() {
	System.out.println("兰州拉面");
}
//无参有返回
public String m2() {
	return "金桔柠檬";
	}
public Person(int pid, String pname, int page) {
	super();
	this.pid = pid;
	this.pname = pname;
	this.page = page;
}


public int getPid() {
	return pid;
}
public void setPid(int pid) {
	this.pid = pid;
}
public String getPname() {
	return pname;
}
public void setPname(String pname) {
	this.pname = pname;
}
public int getPage() {
	return page;
}
public void setPage(int page) {
	this.page = page;
}
}
接下来就是获取属性的方法:
//得到类的对象 
     Class c=Class.forName("com.Zking.xml.Person");
     //属性
     //Field f=c.getField("pname");
     //得到属性名
     //System.out.println(f.getName());
     //得到修饰符
     // System.out.println(f.getModifiers());
     //得到数据类型
     //System.out.println(f.getType());
     //   得到一个person的对象 实例化的一个对象 
     //Object person=c.newInstance();
     //赋值
     //f.set(person, "李易峰");
     //得到值
     //System.out.println(f.get(person));
     //得到类的属性
    // Field f=c.getDeclaredField("page");
     //f.setAccessible(true);
     //Object person=c.newInstance();
     //赋值
     // f.set(person, 20);
     //输出值
     //System.out.println(f.get(person));     
     
     //得到当前类里面所以类的属性
     Field[] fields=c.getDeclaredFields();
     Object person=null;
     for (Field f : fields) {
    	 f.setAccessible(true);
		person=c.newInstance();
		if("pid".contains(f.getName())) {
			f.set(person, 01);
		}else if("pname".contains(f.getName())) {
			f.set(person, "西柚");
		}else if("page".contains(f.getName())) {
			f.set(person, 10);
		}
		System.out.println(f.get(person));
	}

这个是方法:

//方法
   //无参无返回
     Class v=Class.forName("com.Zking.xml.Person");
     Object obj=v.newInstance();
     Method m1=v.getMethod("m1", null);
     m1.invoke(obj, null);
     //无参有返回
     Method m2=v.getMethod("m2", null);
     System.out.println(m2.invoke(obj, null));
    //有参无返回
     Method m3=v.getMethod("m3", Integer.class,String.class,Integer.class);
     m3.invoke(obj, 10,"榴莲",20);
    //有参有返回
     //Method m4=v.getMethod("m4", Integer.class,String.class,Integer.class);
     //System.out.println(m4.invoke(obj, 20,"红柚",29));
     //得到属性值
     Method m4=v.getDeclaredMethod("m4",Integer.class,String.class,Integer.class );
     m4.setAccessible(true);
     System.out.println(m4.invoke(obj, 20,"红柚",20));
     Class[] classes=m4.getParameterTypes();
     for (Class cp : classes) {
		System.out.println(cp.getSimpleName());
	}
     
}

方法关键字

含义

getDeclaredMethods()

获取所有的方法

getReturnType()

获得方法的放回类型

getParameterTypes()

获得方法的传入参数类型

getDeclaredMethod("方法名",参数类型.class,……)

获得特定的方法


结果如下:

可以看person里面的赋值,这是简单的这个方法

以下就是小白的一些小见解,有不足的地方请多多指教!



猜你喜欢

转载自blog.csdn.net/qq_42246091/article/details/80548929