您的位置:首页 > 职场人生

黑马程序员——Java基础——反射

2015-08-03 10:54 801 查看
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

一、概述

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

二、Class

一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的,这一个个的空间可分别用一个个的对象来表示,这些对象显然具有相同的类型,这个类型就是Class。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。

如何得到各个字节码对应的实例对象(Class类型)?
public class ReflectDemo1 {

public static void main(String[] args) throws Exception {
//加载类字节码的三种方法
//1.Object类的getClass方法
Class clazz1 = new ReflectClass().getClass();
//2.数据类型的静态的class属性
Class clazz2 = ReflectClass.class;
//3.通过Class类的静态方法forName
Class clazz3 = Class.forName("test.day4.ReflectClass");

System.out.println(clazz1.getName());
System.out.println(clazz2.getName());
System.out.println(clazz3.getName());

}

}




三、构造函数——Constructor
public class ReflectClass {

public ReflectClass()
{
System.out.println("无参
4000
的公有构造函数");
}

public ReflectClass(String str)
{
System.out.println("有参的公有构造函数:"+str);
}
private  ReflectClass(int num )
{
System.out.println("有参的私有构造函数:"+num);
}

}
import java.lang.reflect.Constructor;

public class ReflectDemo2 {

public static void main(String[] args) throws Exception {

Class clazz = Class.forName("test.day4.ReflectClass");

//通过反射无参的公有构造函数创建对象
Constructor c1 = clazz.getConstructor(null);
ReflectClass rc1 = (ReflectClass)c1.newInstance(null);

//通过反射有参的公有构造函数创建对象
Constructor c2 = clazz.getConstructor(String.class);
ReflectClass rc2 = (ReflectClass)c2.newInstance("java");

//通过反射有参的私有构造函数创建对象,私有需要暴力反射
Constructor c3 = clazz.getDeclaredConstructor(int.class);
c3.setAccessible(true);
ReflectClass rc3 = (ReflectClass)c3.newInstance(1);

}

}



四、成员方法——Method
类中有一个特殊的方法,就是主函数
public class ReflectClass {

public static void main(String[] args) {
// TODO Auto-generated method stub

System.out.println("反射类的主函数:"+args);
}
public void show()
{
System.out.println("无参的公有成员函数");
}
public void show(String str)
{
System.out.println("有参的公有成员函数:"+str);
}

public void show(String[] strs,int num)
{
System.out.println("多个参数(包含数组)的公有成员函数:"+strs+":"+num);
}

public String function(String str)
{
return "带返回值的有参公有成员函数:"+str;
}
private String function(int num)
{
return "带返回值的有参私有成员函数:"+num;
}
public static String function(boolean b)
{
return "静态的有返回值的有参公有成员函数:"+b;
}
}
import java.lang.reflect.Method;

public class ReflectDemo3 {

public static void main(String[] args) throws Exception {

Class clazz = Class.forName("test.day4.ReflectClass");
ReflectClass rc = new ReflectClass();

//反射获取类的主函数
Method method1 = clazz.getMethod("main", String[].class);
method1.invoke(null, (Object)new String[]{"java01","java02"});

//反射无参的公有成员函数
Method method2 = clazz.getMethod("show", null);
method2.invoke(rc, null);

//反射有参的公有成员函数
Method method3 = clazz.getMethod("show", String.class);
method3.invoke(rc, "java01");

//反射多个参数(包含数组)的公有成员函数
Method method4 = clazz.getMethod("show", String[].class,int.class);
method4.invoke(rc,new String[]{"java01","java02"},123);

//反射带返回值的有参公有成员函数
Method method5 = clazz.getMethod("function", String.class);
String s1 = (String)method5.invoke(rc, "java01");
System.out.println(s1);

//反射带返回值的有参私有成员函数
Method method6 = clazz.getDeclaredMethod("function", int.class);
method6.setAccessible(true);
String s2 = (String)method6.invoke(rc, 2);
System.out.println(s2);

//反射无参的公有成员函数
Method method7 = clazz.getMethod("function", boolean.class);
String s3 = (String)method7.invoke(null, true);
System.out.println(s3);
}

}



五、成员变量——Field
public class ReflectClass {

public String str;
private int num;
public static int count;
public final String s = "reflectclass";

public String getStr() {
return str;
}
public int getNum() {
return num;
}
public static int getCount() {
return count;
}
public String getS() {
return s;
}

}
import java.lang.reflect.Field;

public class ReflectDemo4 {

public static void main(String[] args) throws Exception {

Class clazz = Class.forName("test.day4.ReflectClass");
ReflectClass rc = new ReflectClass();

// 反射获取公有的成员变量
Field f1 = clazz.getField("str");
f1.set(rc, "java01");
System.out.println("公有成员变量:" + rc.getStr());

// 反射获取私有的成员变量
Field f2 = clazz.getDeclaredField("num");
f2.setAccessible(true);
f2.set(rc, 1020);
System.out.println("私有成员变量:" + rc.getNum());

// 反射获取公有的静态成员变量
Field f3 = clazz.getField("count");
f3.set(null, 20);
System.out.println("公有成员变量:" + ReflectClass.getCount());

// 反射获取公有的最终类型成员变量
Field f4 = clazz.getField("s");
String s = (String) f4.get(rc);
System.out.println("公有最终类型的成员变量:"+s);

}

}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: