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

Java反射机制总结二

2016-11-22 18:54 453 查看
当我们获取到Class对象的时候,就可以用来获取Class的完整结构,包括构造器,属性,方法和其他的一些信息(父类,包名,接口等信息)。

person.java:

package com.tuxianchao;

import java.util.Comparator;

public class Person extends com.tuxianchao.Biont<String> implements Comparator<Person> {
int id;
private String name;
public int age;

public Person() {
System.out.println("空参构造器...");
}

public Person(String name) {
this.name = name;
}

public Person(String name, int age) {
this.name = name;
this.age = age;
}

public String getName() throws Exception {
return name;
}

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

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public void method(String nation) {
System.out.println("我的国籍是:" + nation);

}

public void method() {
System.out.println("我是" + name);
}

@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}

// 内部类,语言
class Language {
String LanguageName;
String LanguageLocation;

public Language() {
}

public Language(String languageName, String languageLocation) {
LanguageName = languageName;
LanguageLocation = languageLocation;
}

public String getLanguageName() {
return LanguageName;
}

public void setLanguageName(String languageName) {
LanguageName = languageName;
}

public String getLanguageLocation() {
return LanguageLocation;
}

public void setLanguageLocation(String languageLocation) {
LanguageLocation = languageLocation;
}

}

@Override
public int compare(Person o1, Person o2) {
// TODO Auto-generated method stub
return 0;
}

}


Biont.java:

package com.tuxianchao;

/**
* 生物类
*
* @author tuxianchao
*
*/
public class Biont<T> {
private double weight;

public Biont() {
}

public Biont(double weight) {
super();
this.weight = weight;
}

public double getWeight() {
return weight;
}

public void setWeight(double weight) {
this.weight = weight;
}

public void breath() {
System.out.println("呼吸..");
}

}


获取构造器信息

package com.tuxianchao;

import java.lang.reflect.Constructor;

import org.junit.Test;

public class TestConstructor {

@Test
public void test4() throws Exception {
// 调用指定的构造函数来创建运行时类的对象
String className = "com.tuxianchao.Person";
Class clazz = Class.forName(className);
Constructor constructor = clazz.getConstructor(String.class);
constructor.setAccessible(true);
Person p1 = (Person) constructor.newInstance("Zhang");
System.out.println(p1);

Constructor constructor2 = clazz.getConstructor(String.class, int.class);
constructor2.setAccessible(true);
Person p2 = (Person) constructor2.newInstance("Li", 20);
System.out.println(p2);
// 控制台打印
/**
* Person [name=Zhang, age=0]
* Person [name=Li, age=20]
*/
}

@Test
public void test3() throws Exception {
// 创建运行时类的对象
String className = "com.tuxianchao.Person";
Class clazz = Class.forName(className);
// 调用的是空参构造函数来构造对象
// 就要求:运行时类需要有空参构造器,且权限足够
// 创建类的时候尽量保留一个空参的构造器:1.便于反射的时候使用(newInstance),2.被继承时子类默认调用父类的空参构造器
Person p = (Person) clazz.newInstance();
System.out.println(p);
// 控制台打印
/*
* 空参构造器...
* Person [name=null, age=0]
*/
}

@Test
public void test1() throws Exception {
// 获取运行时类的构造器
String className = "com.tuxianchao.Person";
Class clazz = Class.forName(className);
Constructor[] constructors = clazz.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor.getName());
Class[] classes = constructor.getParameterTypes();
System.out.println("形参列表:");
for (Class class1 : classes) {
System.out.println(class1.getName());
}
System.out.println("----");
}
// 控制台打印
/**
*
*
* com.tuxianchao.Person
* 形参列表: java.lang.String int
*  ----
* com.tuxianchao.Person
* 形参列表: java.lang.String
*  ----
* com.tuxianchao.Person
* 形参列表:
*  ----
*
*/
}

}


获取属性信息

package com.tuxianchao;

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

import org.junit.Test;

public class TestField {

@Test
public void test3() {
Class clazz = Person.class;
// 获取属性的权限修饰符,变量类型和变量名
Field field2[] = clazz.getDeclaredFields();
for (int i = 0; i < field2.length; i++) {
// 1.获取属性的权限修饰符
int mod = field2[i].getModifiers();
System.out.println(Modifier.toString(mod));
// 2.获取属性的变量类型
System.out.println(field2[i].getType());
// 3.获取属性的变量名
System.out.println(field2[i].getName());
System.out.println("--------");
}
// 控制台打印
/**
*
*
* int id
* --------
* private
* class java.lang.String
* name
* --------
* public
* int
* age
* --------
*
*/
}

@Test
public void test2() {
// 获取运行时类的属性
Class clazz = Person.class;
// 1.getFields()方法只能获取到运行时类极其父类中声明为public的属性
Field field[] = clazz.getFields();
for (int i = 0; i < field.length; i++) {
System.out.println(field[i]);
}
System.out.println("--------------");
// 2.getDeclaredFields()获取运行时类本身声明的属性(不包括父类中的)
Field field2[] = clazz.getDeclaredFields();
for (int i = 0; i < field2.length; i++) {
System.out.println(field2[i]);
}
}
// 控制台打印
/**
*
* public int com.tuxianchao.Person.age
* --------------
* int com.tuxianchao.Person.id
* private java.lang.String com.tuxianchao.Person.name
* public int com.tuxianchao.Person.age
*
*/
}


获取方法信息

package com.tuxianchao;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

import org.junit.Test;

public class TestMetod {
@Test
public void test3() {
}

@Test
public void test2() throws Exception {
// 获取方法的注解,权限修饰符,返回值类型,方法名,形参列表,异常
String className = "com.tuxianchao.Person";
Class<?> clazz = Class.forName(className);
Method method1[] = clazz.getMethods();
for (int i = 0; i < method1.length; i++) {
// 获取注解
Annotation[] annotation = method1[i].getAnnotations();
System.out.println("注解:");
for (Annotation annotation2 : annotation) {
System.out.println(annotation2);
}
// 获取权限修饰符
int mod = method1[i].getModifiers();
System.out.println("权限修饰符:" + Modifier.toString(mod));
// 获取返回值类型
System.out.println("返回值类型:" + method1[i].getReturnType());
// 获取方法名
System.out.println("方法名:" + method1[i].getName());
// 获取形参列表
Class[] parameters = method1[i].getParameterTypes();
System.out.println("形参列表:");
for (Class class1 : parameters) {
System.out.println(class1.getName());
}
// 获取抛出的异常
Class[] exceptiopns = method1[i].getExceptionTypes();
System.out.println("异常:");
for (Class class1 : exceptiopns) {
System.out.println(class1.getName());
}
System.out.println("------------------");
}
// 控制台打印
/*

注解:
权限修饰符:public
返回值类型:class java.lang.String
方法名:toString
形参列表:
异常:
------------------
注解:
权限修饰符:public
返回值类型:class java.lang.String
方法名:getName
形参列表:
异常:
java.lang.Exception
------------------
注解:
权限修饰符:public
返回值类型:int
方法名:compare
形参列表:
com.tuxianchao.Person
com.tuxianchao.Person
异常:
------------------
注解:
权限修饰符:public volatile
返回值类型:int
方法名:compare
形参列表:
java.lang.Object
java.lang.Object
异常:
------------------
注解:
权限修饰符:public
返回值类型:void
方法名:setName
形参列表:
java.lang.String
异常:
------------------
注解:
权限修饰符:public
返回值类型:void
方法名:method
形参列表:
异常:
------------------
注解:
权限修饰符:public
返回值类型:void
方法名:method
形参列表:
java.lang.String
异常:
------------------
注解:
权限修饰符:public
返回值类型:void
方法名:setAge
形参列表:
int
异常:
------------------
注解:
权限修饰符:public
返回值类型:int
方法名:getAge
形参列表:
异常:
------------------
注解:
权限修饰符:public
返回值类型:void
方法名:setWeight
形参列表:
double
异常:
------------------
注解:
权限修饰符:public
返回值类型:double
方法名:getWeight
形参列表:
异常:
------------------
注解:
权限修饰符:public
返回值类型:void
方法名:breath
形参列表:
异常:
------------------
注解:
权限修饰符:public final
返回值类型:void
方法名:wait
形参列表:
异常:
java.lang.InterruptedException
------------------
注解:
权限修饰符:public final
返回值类型:void
方法名:wait
形参列表:
long
int
异常:
java.lang.InterruptedException
------------------
注解:
权限修饰符:public final native
返回值类型:void
方法名:wait
形参列表:
long
异常:
java.lang.InterruptedException
------------------
注解:
权限修饰符:public
返回值类型:boolean
方法名:equals
形参列表:
java.lang.Object
异常:
------------------
注解:
权限修饰符:public native
返回值类型:int
方法名:hashCode
形参列表:
异常:
------------------
注解:
权限修饰符:public final native
返回值类型:class java.lang.Class
方法名:getClass
形参列表:
异常:
------------------
注解:
权限修饰符:public final native
返回值类型:void
方法名:notify
形参列表:
异常:
------------------
注解:
权限修饰符:public final native
返回值类型:void
方法名:notifyAll
形参列表:
异常:
------------------
注解:
权限修饰符:public
返回值类型:interface java.util.Comparator
方法名:reversed
形参列表:
异常:
------------------
注解:
权限修饰符:public
返回值类型:interface java.util.Comparator
方法名:thenComparing
形参列表:
java.util.function.Function
异常:
------------------
注解:
权限修饰符:public
返回值类型:interface java.util.Comparator
方法名:thenComparing
形参列表:
java.util.Comparator
异常:
------------------
注解:
权限修饰符:public
返回值类型:interface java.util.Comparator
方法名:thenComparing
形参列表:
java.util.function.Function
java.util.Comparator
异常:
------------------
注解:
权限修饰符:public
返回值类型:interface java.util.Comparator
方法名:thenComparingDouble
形参列表:
java.util.function.ToDoubleFunction
异常:
------------------
注解:
权限修饰符:public
返回值类型:interface java.util.Comparator
方法名:thenComparingInt
形参列表:
java.util.function.ToIntFunction
异常:
------------------
注解:
权限修饰符:public
返回值类型:interface java.util.Comparator
方法名:thenComparingLong
形参列表:
java.util.function.ToLongFunction
异常:
------------------

*/
}

@Test
public void test1() throws Exception {
// 获取运行时类的方法
String className = "com.tuxianchao.Person";
Class<?> clazz = Class.forName(className);
// 1.获取所有方法
// getMethods()方法获取运行时类和其父类声明为public的方法
Method method1[] = clazz.getMethods();
for (int i = 0; i < method1.length; i++) {
System.out.println(method1[i]);
}
System.out.println("-------------------------");
// getDeclaredMethods()方法获取运行时类本身声明的所有方法
Method method2[] = clazz.getDeclaredMethods();
for (int i = 0; i < method2.length; i++) {
System.out.println(method2[i]);
}
System.out.println("-------------------------");
// 2.获取指定方法
Method method3 = clazz.getMethod("setAge", int.class);
System.out.println(method3);
}
// 控制台打印
/*
*  public java.lang.String com.tuxianchao.Person.toString()
public java.lang.String com.tuxianchao.Person.getName() throws java.lang.Exception
public int com.tuxianchao.Person.compare(com.tuxianchao.Person,com.tuxianchao.Person)
public int com.tuxianchao.Person.compare(java.lang.Object,java.lang.Object)
public void com.tuxianchao.Person.setName(java.lang.String)
public void com.tuxianchao.Person.method()
public void com.tuxianchao.Person.method(java.lang.String)
public void com.tuxianchao.Person.setAge(int)
public int com.tuxianchao.Person.getAge()
public void com.tuxianchao.Biont.setWeight(double)
public double com.tuxianchao.Biont.getWeight()
public void com.tuxianchao.Biont.breath()
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
public default java.util.Comparator java.util.Comparator.reversed()
public default java.util.Comparator java.util.Comparator.thenComparing(java.util.function.Function)
public default java.util.Comparator java.util.Comparator.thenComparing(java.util.Comparator)
public default java.util.Comparator java.util.Comparator.thenComparing(java.util.function.Function,java.util.Comparator)
public default java.util.Comparator java.util.Comparator.thenComparingDouble(java.util.function.ToDoubleFunction)
public default java.util.Comparator java.util.Comparator.thenComparingInt(java.util.function.ToIntFunction)
public default java.util.Comparator java.util.Comparator.thenComparingLong(java.util.function.ToLongFunction)
-------------------------
public java.lang.String com.tuxianchao.Person.toString()
public java.lang.String com.tuxianchao.Person.getName() throws java.lang.Exception
public int com.tuxianchao.Person.compare(com.tuxianchao.Person,com.tuxianchao.Person)
public int com.tuxianchao.Person.compare(java.lang.Object,java.lang.Object)
public void com.tuxianchao.Person.setName(java.lang.String)
public void com.tuxianchao.Person.method()
public void com.tuxianchao.Person.method(java.lang.String)
public void com.tuxianchao.Person.setAge(int)
public int com.tuxianchao.Person.getAge()
-------------------------
public void com.tuxianchao.Person.setAge(int)

*/

}


获取类的其他相关信息

package com.tuxianchao;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import org.junit.Test;

public class TestOthers {

@Test
public void test4() throws Exception {
// 获取所在的包
String className = "com.tuxianchao.Person";
Class clazz = Class.forName(className);
Package package1 = clazz.getPackage();
System.out.println(package1.getName());
// 控制台打印
/*
com.tuxianchao

*/
}

@Test
public void test3() throws Exception {
// 获取实现的接口
String className = "com.tuxianchao.Person";
Class clazz = Class.forName(className);
Class[] classes = clazz.getInterfaces();// 只能获取到本身实现的接口,获取不到接口的父接口
for (Class class1 : classes) {
System.out.println(class1.getName());
}
// 控制台打印
/*
java.util.Comparator
*/
}

@Test
public void test2() throws Exception {
// 获取父类的泛型
String className = "com.tuxianchao.Person";
Class clazz = Class.forName(className);

Type type = clazz.getGenericSuperclass();
ParameterizedType param = (ParameterizedType) type;
Type[] types = param.getActualTypeArguments();
for (Type type2 : types) {
System.out.println(((Class) type2).getName());
}
// 控制台打印
/*
*
java.lang.String

*/
}

@Test
public void test1() throws Exception {
// 获取运行时类的父类
String className = "com.tuxianchao.Person";
Class clazz = Class.forName(className);
Class superClazz = clazz.getSuperclass();
System.out.println(superClazz);
// 获取带有泛型的父类
Type superClazz1 = clazz.getGenericSuperclass();
System.out.println(superClazz1);
}
// 控制台打印
/*
class com.tuxianchao.Biont
com.tuxianchao.Biont<java.lang.String>
*/
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java class 对象