反射
先看一下反射的概念:
主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。但是反射使用不当会成本很高!
反射机制的作用:
1,反编译:.class–>.java
2,通过反射机制访问java对象的属性,方法,构造方法等;
这样好像更容易理解一些,下边我们具体看怎么实现这些功能。
构造类方法如下
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @author Aoman_Hao
*/
public class ReflectDemo {
public static void main(String[] args) throws Exception {
//反射获取构造方法
Class<?> c = Class.forName("Day23_reflect.Star");
//所有公共构造方法
Constructor[] con = c.getConstructors();
//获取类中的构造方法
Constructor[] decon = c.getDeclaredConstructors();
for(Constructor deco : decon){
System.out.println("构造方法:"+deco);
}
System.out.println("------------");
//用反射给属性赋值
//获取构造器----通过反射获取指定构造方法 getConstructor(class)
Constructor<?> con_c = c.getConstructor(String.class,int.class,String.class);
//创建构造器的实例对象实例对象实例对象实例对象实例对象实例对象
Object con_star1 = con_c.newInstance("刘诗诗",23,"女");
System.out.println(con_star1);
System.out.println("------------");
//通过反射获取成员变量并使用
//getFields()返回field对象,getDeclaredFields()获得公共的或者私有的对象
Field[] con_Fie = c.getFields();
Field[] con_DeFie = c.getDeclaredFields();
//遍历
for(Field fi : con_DeFie){
System.out.println("成员变量"+fi);
}
System.out.println("------------");
//通过反射获取成员方法
//getMethods():获取当前该字节码文件对象(Person.class)中自己本身以及它父类中所有的公共成员方法
//getDeclaredMethods():获取当前字节码文件对象本身所有的成员方法
Method[] con_Me = c.getMethods();
Method[] con_DeMe = c.getDeclaredMethods();
for(Method con_Method : con_DeMe){
System.out.println("成员方法"+con_Method);
}
}
}
输出:
构造方法:public Day23_reflect.Star()
构造方法:public Day23_reflect.Star(java.lang.String,int,java.lang.String)
------------
Star [name=刘诗诗, age=23, gender=女]
------------
成员变量private java.lang.String Day23_reflect.Star.name
成员变量private int Day23_reflect.Star.age
成员变量private java.lang.String Day23_reflect.Star.gender
------------
成员方法public java.lang.String Day23_reflect.Star.toString()
成员方法public java.lang.String Day23_reflect.Star.getName()
成员方法public void Day23_reflect.Star.setName(java.lang.String)
成员方法public int Day23_reflect.Star.getAge()
成员方法public java.lang.String Day23_reflect.Star.getGender()
成员方法public void Day23_reflect.Star.setAge(int)
成员方法public void Day23_reflect.Star.setGender(java.lang.String)