java 动态反射_Java 动态特性一:反射(reflect)

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

下面是反射机制用到的基本的代码:

ReflectTest 测试反射机制的类

User 实体类

package com.test.reflect;

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

/**

* 测试java反射

* @author zhb

*

*/

public class ReflectTest {

private static void test() throws Exception {

String path = "com.test.reflect.User";

// 获取类信息的方式有三种,三种方式获取的类对象相同;clazz是以后操作的关键

// 第一种方式

Class clazz = Class.forName(path);

// 第二种方式

Class clazz1 = User.class;

// 第三种方式

User u = new User();

Class clazz2 = u.getClass();

System.out.println(clazz.hashCode());

System.out.println(clazz1.hashCode());

System.out.println(clazz2.hashCode());

// 获取类名称包名+类名;

String className = clazz.getName(); // clazz.getSimpleName(); // 只有类名

// 获取clazz构造方法

// 利用无参的构造方法创建对象user, 比较常用

User user = (User) clazz.newInstance();

user.setName("张三");

// 获取有参的构造方法

Constructor constructor = clazz.getConstructor(new Class[]{int.class, String.class});

// 根据获取的有参的构造方法创建一个对象

User user2 = constructor.newInstance(1001, "李四");

System.out.println(user.getName()+"---------"+user2.getName());

// 对属性的操作

// 这样只能获取public的属性

Field[] fields = clazz.getFields();

// 获取所有的属性 declared:公告的

Field[] fields1 = clazz.getDeclaredFields();

// 根据属性的名字获取属性

Field field = clazz.getDeclaredField("name");

// 跳过检查,不然给私有变量赋值会报错,也会提高效率,建议使用

field.setAccessible(true);

field.set(user, "王五");

System.out.println(user.getName());

// 对方法的操作

// 获取所有的公共方法

Method[] methods = clazz.getMethods();

// 获取所有的方法

Method[] methods1 = clazz.getDeclaredMethods();

// 根据指定的名字获取方法, public类型的方法

Method method = clazz.getMethod("hello", String.class);

// 跳过验证 ,提高效率

method.setAccessible(true);

Object result = method.invoke(user, "调用方法");

System.out.println(result);

}

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

test();

}

}

package com.test.reflect;

public class User {

private int id;

private String name;

// 无参的构造方法,容易被忘记

public User(){

}

//有参的构造方法

public User(int id, String name){

this.id = id;

this.name = name;

}

// 类中一个普通的方法

public String hello(String name){

System.out.println("hello:"+ name);

return "方法调用成功";

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值