您的位置:首页 > 编程语言 > Java开发

Java反射常用API

2017-02-01 20:22 399 查看

Java反射概述

Java通过反射技术可以动态的创建类的实例并可以拿到类的定义、方法、属性等,从而可以实现非常灵活的功能。

Java反射常用API

直接上代码。

MyReflect.java

package com.mrbcy.bigdata.basic.reflect;

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

import org.junit.Before;
import org.junit.Test;

public class MyReflect {
public String className = null;
public Class personClass = null;

@Before
public void init() throws Exception {
className = "com.mrbcy.bigdata.basic.reflect.Person";
personClass = Class.forName(className);
}

@Test
public void getClassName() throws Exception {
System.out.println(personClass);
}

@Test
public void getClassName2() throws Exception {
System.out.println(Person.class);
}

@Test
// 获得实例
public void getNewInstance() throws Exception {
System.out.println(personClass.newInstance());
}

// 获得非私有的构造函数
@Test
public void getPublicConstructors() throws Exception {
Constructor constructor = personClass.getConstructor(Long.class,String.class);
Person person = (Person) constructor.newInstance(100L,"你好");
System.out.println(person);
}

// 获得私有的构造函数
@Test
public void getPrivateConstructor() throws Exception {
Constructor constructor = personClass.getDeclaredConstructor(String.class);
constructor.setAccessible(true); // 强制取消Java的权限检测
Person person = (Person) constructor.newInstance("啊哈哈哈");
System.out.println(person);
}

// 获得非私有的成员变量
@Test
public void getNotPrivateField() throws Exception {
Constructor constructor = personClass.getConstructor(Long.class,String.class);
Object object = constructor.newInstance(100L,"张三");

Field field = personClass.getField("name");
field.set(object, "李四");
System.out.println(object);
}

// 获得私有的成员变量
@Test
public void getPrivateField() throws Exception {
Constructor constructor = personClass.getConstructor(Long.class);
Object object = constructor.newInstance(10000L);
Field field = personClass.getDeclaredField("id");
field.setAccessible(true);
field.set(object, 1L);
System.out.println(object);
}

/**
*获取非私有的成员函数
*/
@Test
public void getNotPrivateMethod() throws Exception {
System.out.println(personClass.getMethod("toString"));

Object obj = personClass.newInstance();//获取空参的构造函数
Method toStringMethod = personClass.getMethod("toString");
Object object = toStringMethod.invoke(obj);
System.out.println(object);
}
/**
*获取私有的成员函数
*/
@Test
public void getPrivateMethod() throws Exception {
Object obj = personClass.newInstance();//获取空参
4000
的构造函数
Method method = personClass.getDeclaredMethod("getSomeThing");
method.setAccessible(true);
Object value = method.invoke(obj);
System.out.println(value);

}

// 其他方法
@Test
public void otherMethod() throws Exception {
//当前加载这个class文件的那个类加载器对象
System.out.println(personClass.getClassLoader());
//获取某个类实现的所有接口
Class[] interfaces = personClass.getInterfaces();
for (Class class1 : interfaces) {
System.out.println(class1);
}
//反射当前这个类的直接父类
System.out.println(personClass.getGenericSuperclass());
/**
* getResourceAsStream这个方法可以获取到一个输入流,这个输入流会关联到name所表示的那个文件上。
*/
//path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。
System.out.println(personClass.getResourceAsStream("/log4j.properties"));
System.out.println(personClass.getResourceAsStream("log4j.properties"));

//判断当前的Class对象表示是否是数组
System.out.println(personClass.isArray());
System.out.println(new String[3].getClass().isArray());

//判断当前的Class对象表示是否是枚举类
System.out.println(personClass.isEnum());
System.out.println(Class.forName("com.mrbcy.bigdata.basic.reflect.City").isEnum());

//判断当前的Class对象表示是否是接口
System.out.println(personClass.isInterface());
System.out.println(Class.forName("com.mrbcy.bigdata.basic.reflect.TestInterface").isInterface());

}
}


Person.java

package com.mrbcy.bigdata.basic.reflect;

import java.io.Serializable;

public class Person implements Serializable,TestInterface{
private Long id;
public String name;

public Person() {
this.id = 100L;
this.name = "afsdfasd";
}

public Person(Long id, String name) {
//      super();
this.id = id;
this.name = name;
}

public Person(Long id) {
super();
this.id = id;
}
@SuppressWarnings("unused")
private Person(String name) {
super();
this.name = name+"=======";
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String toString() {
return "Person [id=" + id + ", name=" + name + "]";
}
private String getSomeThing() {
return "sdsadasdsasd";
}

private void testPrivate(){
System.out.println("this is a private method");
}
}


TestInterface.java

package com.mrbcy.bigdata.basic.reflect;

public interface TestInterface {

}


City.java

package com.mrbcy.bigdata.basic.reflect;

public enum City {

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