Java的反射机制

来源:互联网 发布:java 迭代器 从头 编辑:程序博客网 时间:2024/06/07 17:56

Java 反射的简单介绍与运用

java的反射机制:简单来说就是通过类名来获得类的所有信息。

优点:可以实现动态创建和编译,体现出灵活性。

缺点:运行效率没有直接new对象快,但现在有很大的提升,可以忽略不计

   首先获得类的Class文件(.calss文件)

      1、通过类的全名(含包名),但不推荐使用,编译时,编译器并不知道该类是否存在,需要抛出异常:

            Class clazz=Class.forName("className");

      2、直接通过类名(不含包名),编译时可以直接发现该类是否存在

            Class clazz=className.class;

   创建对象实例

           Object  obj =clazz.newInstance();

   获得属性的方法

        1、获得public属性
             Field f1=clazz .getField("name");
             f1.set(obj,"liu");
        2、获得非public属性
             Field f2=clazz .getDeclaredField("name");
             f2.setAccessible(true);
             f2.set(obj,"liu");
        3、获得所有public属性
             Field[] f3=clazz .getField();
        4、获得所有public属性
             Field[] f4=clazz .getDeclaredField();
   获得方法的方法
        1、获得无形参的方法
           Method m1=clazz.getMethod("getName");
           m1.invoke(obj);
        2、获得有形参的方法
           Method m2=clazz.getMethod("disPlay",String.class);//String.class为形参的类型
           m2.invoke(obj);
        3、获得所有的方法
           Method[] m3=clazz.getMethod();


package javabean;

public class User {
private String name;
private String password;
public User() {
// TODO Auto-generated constructor stub
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public void disPlay(String sort){
System.out.println("该用户的身份:"+sort);
}
@Override
public String toString() {
return "User [name=" + name + ", password=" + password + "]";
}
}

package javabean;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test {
public void test() throws InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
Class<User> clazz=User.class;
/*Class<User> clazz=Class.forName("javabean.User.java");*/
User user=clazz.newInstance();
Field f1=clazz.getDeclaredField("name");
f1.setAccessible(true);
f1.set(user, "jxy");
Field f2=clazz.getDeclaredField("password");
f2.setAccessible(true);
f2.set(user, "123");
Method m1=clazz.getMethod("disPlay", String.class);
m1.invoke(user, "管理员");
}
public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
Test t=new Test();
t.test();
}
}


提示:只是简单的介绍了反射机制的使用,如果想继续深入了解,可以再查看其他的文档或视频。
1 0
原创粉丝点击