1、什么是java反射机制
java反射机制是在运行状态 中,对任意一个实体类,都能够知道这个类的所有属性和方法,对任意一个对象,都能调用它的任意方法和属性,这种动态获取信息以及动态调用对象方法的功能称为java反射机制。
2、如何获取Class对象
- 类名.class;
- 对象名.getClass()
- Class.forName(全限定名)
package com.test;
class People{
private String name;
private int age;
public People(String name, int age) {
this.name = name;
this.age = age;
}
public void show(){
System.out.println(name+" "+age);
}
}
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
People p = new People("tom",18);
Class<People> c = People.class;
System.out.println("根据类名.class获取\t\t" + People.class);
System.out.println("根据对象名.getClass()获取" + p.getClass());
System.out.println("根据Class.forName()获取\t" + Class.forName("com.test.People"));
System.out.println("获取全限定名\t\t\t\t" + c.getName());
System.out.println("获取简单类名\t\t\t\t" + c.getSimpleName());
}
}
结果:
根据类名.class获取 class com.test.People
根据对象名.getClass()获取class com.test.People
根据Class.forName()获取 class com.test.People
获取全限定名 com.test.People
获取简单类名 People
3、获取构造函数
package com.test;
import java.lang.reflect.*;
class People{
private String name;
private int age;
public People(String name, int age) {
this.name = name;
this.age = age;
}
public void show(){
System.out.println(name+" "+age);
}
}
public class Test {
public static void main(String[] args) throws Exception {
Class<People> userClass = People.class;
Constructor<?> constructors[] = userClass.getConstructors();
People people = (People)constructors[0].newInstance("Tom",18);
people.show();
}
}
结果:
Tom 18
4、获取属性
package com.test;
import java.lang.reflect.*;
class People{
private String name;
private int age;
public People(String name, int age) {
this.name = name;
this.age = age;
}
public void show(){
System.out.println(name+" "+age);
}
}
public class Test {
public static void main(String[] args) throws Exception {
Class<People> userClass = People.class;
Constructor<?> constructors[] = userClass.getConstructors();
People people = (People)constructors[0].newInstance("Tom",18);
Field fields[] = userClass.getDeclaredFields();
Field.setAccessible(fields,true);
for(Field field:fields)
{
System.out.print("属性名:"+field.getName());
System.out.print("\t属性值:"+field.get(people));
System.out.print("\t属性类型:"+field.getType());
System.out.println();
}
}
}
结果:
属性名:name 属性值:Tom 属性类型:class java.lang.String
属性名:age 属性值:18 属性类型:int
5、获取方法
package com.test;
import java.lang.reflect.*;
class People{
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public People(String name, int age) {
this.name = name;
this.age = age;
}
public void show(){
System.out.println(name+" "+age);
}
}
public class Test {
public static void main(String[] args) throws Exception {
Class<People> userClass = People.class;
Constructor<?> constructors[] = userClass.getConstructors();
People people = (People)constructors[0].newInstance("Tom",18);
Method methods[] = userClass.getDeclaredMethods();
Method.setAccessible(methods,true);
for(Method method:methods)
{
System.out.print("方法名:"+method.getName());
System.out.println("\t返回类型:"+method.getReturnType().getName());
}
}
}
结果:
方法名:getName 返回类型:java.lang.String
方法名:setName 返回类型:void
方法名:setAge 返回类型:void
方法名:getAge 返回类型:int
方法名:show 返回类型:void