java反射机制

来源:互联网 发布:视频混合软件 编辑:程序博客网 时间:2024/05/19 16:22

JAVA反射机制

 

java中使用反射,任何类在你眼里都是裸奔

 

文章包含内容:

1、反射机制是什么?

2、反射机制的优缺点

3、反射机制得到类的方式

4、反射机制初始化对象

5、Class类的方法举例

6、反射机制示例

 

一、反射机制是什么?

Java中反射机制是程序在运行过程中,对于任意的类都能得到该类的所有属性和方法;对于任意一个对象,都能调用该类的任意的方法和属性。这种动态获取信息以及动态调用对象的方法的功能称为java语言的反射机制。

 

二、反射机制的优缺点

优点:增加了程序的灵活性

缺点:影响性能,破坏了oop中的封装

 

三、反射机制得到类的方式

(1)Class cl1 = Class.forName(“类的路径”);//通过ClassforName()方法得到类

(2)Class cl2 = 类名.class;//通过类的class属性得到类

(3)Class cl3 = 对象名.getClass();//通过对象的getClass方法得到类

 

四、反射机制初始化对象

对象名.newInstance();//执行类的无参构造

 

五、Class类的方法举例

(1)getPackage();//获得包名

(2)getName();//获得类名

(3)getDeclaredField(“属性名”);//获得特定属性

(4)getDeclaredFields();//过得所有的属性

(5)getDeclaredConstructors();//获得所有构造

(6)getDeclaredConstructors(参数类型.Class);//获得特定构造方法

(7)getDeclaredMethod(“方法名”);//获得特定的无参方法

(8)getDeclaredMethod(“方法名”,参数类型.Class);//获得特定的带参数方法

(9)getDeclaredMethods();//获得所有的方法

(10)getReturnType();//获得方法的返回值类型

(11)getParameterTypes();//获得方法的参数类型

(12)getSuperclass();//获得父类

(13)getInterface();//获得该类实现的接口

(14)getSimpleName();//获得源码中底层类的简称

六、反射机制实例

(1)实体类

package cn.gson.test;

public class Person {

private String name;//name属性

private int age;//age属性

//无参构造

public Person() {

super();

}

//有参构造

public Person(String name, int age) {

super();

this.name = name;

this.age = age;

}

//setter/getter方法

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 void hello(){

System.out.println("hello world!");

}

//带参方法

public void hello(String name){

System.out.println(name+"hello world!");

}

 

}

 

(2)测试类

package cn.gson.test;

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

 

public class Test {

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

//可以通过三种方式获得类

//第一种

//Test person = new Person();

//Class class1 = person.getClass();

//第二种

//Class class3 = Class.forName("cn.gson.test.Person");

//第三种

Class<Person> class2 = Person.class;

Person person = (Person) class2.newInstance();//实例化类

//1.获得类所在包

Package packageName =class2.getPackage();

System.out.println("包:"+packageName);

//2.获得类

String className = class2.getName();

System.out.println("类:"+className);

//3.获得特定属性

Field nameField =class2.getDeclaredField("name");

nameField.setAccessible(true);//设置可以操作私有的属性或方法

nameField.set(person, "学的是梦想啊");//设置属性

System.out.println("属性:"+nameField.get(person));

//4.获得所有属性

Field[] fields = class2.getDeclaredFields();

for (Field field : fields) {

field.setAccessible(true);

System.out.println("所有属性:"+field);

}

//5.获得所有构造方法

Constructor<?>[] constructors = class2.getDeclaredConstructors();

for (Constructor<?> constructor : constructors) {

System.out.println("所有构造方法:"+constructor);

}

//6.获得特定的构造方法

Constructor<Person> constructor = class2.getDeclaredConstructor(String.class,int.class);//参数类型

System.out.println("构造方法:"+constructor);

//7.获得特定的无参成员方法

Method methods = class2.getDeclaredMethod("hello");

methods.setAccessible(true);

methods.invoke(person);//执行方法

//8.执行特定的带参数成员方法

Method methods1 = class2.getDeclaredMethod("hello",String.class);

methods1.setAccessible(true);

methods1.invoke(person,"梦想");

//9.获得所有的方法

Method[] methods11= class2.getDeclaredMethods();

for (Method method : methods11) {

System.out.println("所有成员方法:"+method);

}

//10.方法的返回值类型

Class returnType = methods1.getReturnType();

System.out.println("方法的返回值类型:"+returnType);

//11.方法的参数类型

Class parameterType[] =  methods1.getParameterTypes();

for (Class class1 : parameterType) {

System.out.println("方法的参数类型:"+class1);

}

}

}

 

(3)测试结果

 

0 0
原创粉丝点击