反射机制,程序在运行时加载新的类,使程序更加灵活

public class HelooReflect {
public static void main(String[] args) {
// 获取类
testClass();
}
private static void testClass() {
// 创建一个学生类的对象
Student student = new Student();
try {
// 开始获取类
Class clazz1 = Student.class;
Class clazz2 = student.getClass();
Class clazz3 = Class.forName("com.bjsxt.java.clc.fanshe.Student");
//判断类对象是否相等
System.out.println(clazz1 == clazz2);
System.out.println(clazz1 == clazz3);
//常见 方法
System.out.println("类的名字" + clazz1.getName());
System.out.println("类的简称" + clazz1.getSimpleName());
System.out.println("包的信息" + clazz1.getPackage().getName());
System.out.println("获取包名" + clazz1.getPackage());
System.out.println("获取修饰符" + clazz1.getModifiers());
System.out.println("获取父类" + clazz1.getSuperclass());
System.out.println("获取父类的超类" + clazz1.getGenericSuperclass());
System.out.println("判断是否为接口" + clazz1.isInterface());
System.out.println("获取类加载器" + clazz1.getClassLoader()); //基本类型9=(8种基本数据类型的类+1void)
System.out.println(int.class == Integer.class);//不等
//判断是否是基本类型
System.out.println(int.class.isPrimitive());
System.out.println(Integer.class.isPrimitive());
System.out.println("数组是引用类型" + int[].class.isPrimitive());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

获取类的名字,方法,属性,构造器

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test2 {
public static void main(String[] args) {
try {
Class clazz = Class.forName("bean.User");
// 获取类的名字
clazz.getName();
/**
* 获取属性信息
*/
// 只能获取public的属性
Field[] fields1 = clazz.getFields();
// 可以获得所有的属性
Field[] fields2 = clazz.getDeclaredFields();
// 输出获取到的属性的个数
System.out.println(fields1.length);
System.out.println(fields2.length);
// 遍历获取到的属性
for (Field field : fields2) {
System.out.println("属性" + field);
}
// 获得属性的权限
Field f = clazz.getDeclaredField("uname");
System.out.println(f);
/**
* 获取方法的信息
*/
Method[] methods = clazz.getDeclaredMethods();
Method m01 = clazz.getDeclaredMethod("getUname", null);
// 如果方法有参,则必须传递参数类型对应的class对象
Method m02 = clazz.getDeclaredMethod("setUname", String.class);
for (Method method : methods) {
System.out.println("方法" + method);
}
/**
*获取构造器信息
*/
Constructor[] constructors = clazz.getDeclaredConstructors();
Constructor c = clazz.getDeclaredConstructor(int.class,int.class,String.class);
System.out.println("获得构造器"+c);
for (Constructor constructor : constructors) {
System.out.println("构造器"+constructor);
} } catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

通过反射操作类的属性,方法构造器

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import bean.User;
/**
* @author clc
*
*/
public class Test3 {
public static void main(String[] args) {
try {
Class<User> clazz = (Class<User>) Class.forName("bean.User");
// 通过反射API调用构造方法,构造对象
// 其实调用了User的无参构造方法
User u1 = clazz.newInstance();
System.out.println(u1);
// 有参调用构造器
Constructor<User> c = clazz.getDeclaredConstructor(int.class, int.class, String.class);
User u2 = c.newInstance(1234, 22, "clc");
System.out.println(u2);
// 通过反射调用普通方法
User u3 = clazz.newInstance();
Method method = clazz.getDeclaredMethod("setUname", String.class);
// 相当于u3.setUname("clc3");
method.invoke(u3, "clc3");
System.out.println(u3);
// 通过反射操作属性
User u4 = clazz.newInstance();
Field f = clazz.getDeclaredField("uname");
// 设置属性不需要安全检查,可以直接访问
f.setAccessible(true);
// 通过反射直接设置属性
f.set(u4, "clc4");
// 通过反射直接读取属性值
System.out.println(u4.getUname());
System.out.println(f.get(u4));
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

辅助类User

package bean;
public class User {
private int id;
private int age;
private String uname;
@Override
public String toString() {
return "User [id=" + id + ", age=" + age + ", uname=" + uname + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + id;
result = prime * result + ((uname == null) ? 0 : uname.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (age != other.age)
return false;
if (id != other.id)
return false;
if (uname == null) {
if (other.uname != null)
return false;
} else if (!uname.equals(other.uname))
return false;
return true;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public User(int id, int age, String uname) {
super();
this.id = id;
this.age = age;
this.uname = uname;
}
public User() {
super();
}
}
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
 
import bean.User;
 
/**
 * @author clc
 *
 */
public class Test3 {
    public static void main(String[] args) {
        try {
            Class<User> clazz = (Class<User>) Class.forName("bean.User");
            // 通过反射API调用构造方法,构造对象
 
            // 其实调用了User的无参构造方法
            User u1 = clazz.newInstance();
            System.out.println(u1);
 
            // 有参调用构造器
            Constructor<User> c = clazz.getDeclaredConstructor(int.class, int.class, String.class);
            User u2 = c.newInstance(1234, 22, "clc");
            System.out.println(u2);
 
            // 通过反射调用普通方法
            User u3 = clazz.newInstance();
            Method method = clazz.getDeclaredMethod("setUname", String.class);
 
            // 相当于u3.setUname("clc3");
            method.invoke(u3, "clc3");
            System.out.println(u3);
 
            // 通过反射操作属性
            User u4 = clazz.newInstance();
            Field f = clazz.getDeclaredField("uname");
            // 设置属性不需要安全检查,可以直接访问
            f.setAccessible(true);
            // 通过反射直接设置属性
            f.set(u4, "clc4");
            // 通过反射直接读取属性值
            System.out.println(u4.getUname());
            System.out.println(f.get(u4));
 
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Java反射的基本应用的更多相关文章

  1. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  2. Java反射机制

    Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射:     静态编译:在编译时确定类型,绑定对象,即通过 ...

  3. java反射(基础了解)

    package cn.itcast_01; /** *Person类 */ public class Person {    /** 姓名 */    private String name;     ...

  4. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  5. java基础知识(十一)java反射机制(下)

    1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...

  6. java反射学习之二万能EXCEL导出

    一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对 ...

  7. java反射学习之一反射机制概述

    一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...

  8. java反射 之 反射基础

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

  9. java反射 cglib asm相关资料

    有篇文章对java反射的调用的效率做了测试,写的比较好.猛击下面地址 http://www.blogjava.net/stone2083/archive/2010/09/15/332065.html ...

  10. 超详细的java反射教程

    看技术博客时,看到关于java反射的博文,写的非常好.猛击下面的地址,开始java反射之旅 中文翻译地址:http://ifeve.com/java-reflection/ 英文原版地址:http:/ ...

随机推荐

  1. luogu2596 [ZJOI2006]书架

    treap.树是以"优先级"(优先级越小,在书架上越靠上)形成的,堆是以rand()的权值形成的.还要再维护一个原编号. 置顶/置底:找到那个元素,把它拉出来修改优先级再塞回去. ...

  2. AutoItLibrary之键盘操作(send)

    最近有人问到我键盘操作用什么库?用到库里面的哪个方法?我在这里总结一下,第一次写,有片面的地方还请指出,一块进步.1.首先,用到的库是AutoItLibrary,用到的方法是send:按F5可用看到 ...

  3. CSS选择器定位的使用

    CSS 可以比较灵活选择控件的任意属性,一般情况下定位速度要比XPath 快,但对于初学者来说比较难以学习使用,下面我们就详细的介绍CSS 的语法与使用.一.CSS 选择器的常见语法: 例如下面一段代 ...

  4. 一个抓取智联招聘数据并存入表格的python爬虫

    talk is cheap...show you the code..... import requests import lxml,time,os from bs4 import Beautiful ...

  5. Relocation(状压DP)

    Description Emma and Eric are moving to their new house they bought after returning from their honey ...

  6. 【ITOO 1】SQLBulkCopy实现不同数据库服务器之间的批量导入

    导读:在做项目的时候,当实现了动态建库后,需要实现从本地服务器上获取数据,批量导入到新建库的服务器中的一个表中去.之前是用了一个SQL脚本文件实现,但那时候没能实现不同的数据库服务器,现在用了SqlB ...

  7. .net中的协变和逆变

    百度:委托中的协变和逆变. 百度:.net中的协变和逆变. 协变是从子类转为父类. 逆变是从父类到子类. 这样理解不一定严谨或者正确.需要具体看代码研究.

  8. DBCA建库出错ORA-00600: internal error code, arguments

    正常步骤安装完成Oralce,通过dbca建库,报错如下图所示: Oracle安装日志中报错如下: [Thread-40] [ 1999-12-15 12:23:54.055 CST ] [Basic ...

  9. 【搜索】codeforces C. The Tag Game

    http://codeforces.com/contest/813/problem/C [题意] 给定一棵有n个结点的树,初始时Alice在根结点1,Bob在非根结点x; Alice和Bob轮流走,每 ...

  10. HDU 2629 Identity Card

    简单题 给出身份证号 判断住址 和出生年月 熟练字符串的操作 主要是string::substr(s, l)//s:起始位置 l长度 #include <iostream> #includ ...