概述:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
(class类是用来描述类的类)
事前准备:
建立一个Dog.java
package cn.myseudy.reflect;
public class Dog {
public String name;
public int age;
protected int weight;
private String gender;
private String color;
private String type;
public void run() {
}
public void run(String name) {
}
public void run(String aaa, int bbb){
System.out.println(aaa + "say:" + "我是" + bbb);
}
public static void eat() {
System.out.println("吃东西,很开心!");
}
private void sleep() {
System.out.println("睡觉不能被打扰!");
}
public int add(int a, int b) {
return a + b;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Dog(String name, int age, int weight, String gender, String color, String type) {
super();
this.name = name;
this.age = age;
this.weight = weight;
this.gender = gender;
this.color = color;
this.type = type;
}
public Dog() {
super();
}
}
一、Class
1、创建Class实例化的三种方法
(由于Class类没有公共构造方法,所有创建Class的对象的方法有以下几种:)
准备:建立一个TestClass.java
package cn.myseudy.reflect;
public class TestClass {
public static void main(String[] args) {
try {
//1、通过Class.forName()静态方法返回Class类的一个实例
Class cls = Class.forName("cn.myseudy.reflect.Dog");
//2、通过类名.class来获取一个Class类的实例
Class cls2 = Dog.class;
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
第三种:代码运行在非静态区,通过this.getClass()获取Class类的一个实例
例:在Dog.java中的类中加入
Class cls = this.getClass();
2、Class的具体操作
package cn.myseudy.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class TestClass2 {
public static void main(String[] args) {
try {
Class cls = Class.forName("cn.myseudy.reflect.Dog");
//类的属性
//获取类名
System.out.println(cls.getName());
System.out.println(cls.getSimpleName());
//获取类的修饰限定符
int modi = cls.getModifiers();
System.out.println(modi);
//获取一个类的属性
//根据一个属性名获取一个public属性的描述
Field field = cls.getField("name");
//获取一个类的全部public属性的描述
Field[] fields = cls.getFields();
System.out.println(fields.length);
//根据一个属性名获取一个在类中声明的属性的描述
Field declaredField = cls.getDeclaredField("gender");
//获取所有在类中声明的属性的描述
Field[] declaredFields = cls.getDeclaredFields();
//获取一个类的方法
//根据一个方法的名字获取类中的一个public的方法的描述
Method method = cls.getMethod("run", String.class,int.class);
//获取所有在类中是public的方法的描述
Method[] methods = cls.getMethods();
//根据一个方法名获取在类中声明的一个方法的描述
Method declaredMethod = cls.getDeclaredMethod("eat", null);
//获取所有在类中声明的方法的描述
Method[] declaredMethods = cls.getDeclaredMethods();
//返回cls所代表的类的实例
Object obj = cls.newInstance();
System.out.println(obj);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}












网友评论