11 java 王少飞-java SE 加强 反射小节

反射

 一个类有多个组成部分,例如:成员变量,方法,构造方法等。反射就是加载类,并解剖出类的各个组成部分。

Java反射所需要的类并不多,主要有java.lang.Class类和java.lang.reflect包中的Field、Constructor、Method、Array类。
注意:Class类是Java反射的起源,针对任何一个你想探勘的类,只有先为它产生一个Class类的对象,接下来才能通过Class对象获取其他想要的信息。
 
Class类
•JVM为每种类型管理着一个独一无二的Class对象----每个类(型)都有一个Class对象。
•Java程序运行过程中,当需要创建某个类的实例时,JVM首先检查所要加载的类对应的Class对象是否已经存在。如果还不存在,JVM就会根据类名查找对应的字节码文件并加载,接着创建对应的Class对象,最后才创建出这个类的实例。
•Java基本数据类型(boolean、byte、char、short、int、long、float 和 double);
•关键字void 也都对应一个 Class 对象;
•每个数组属性也被映射为 Class 对象,所有具有相同类型和维数的数组都共享该 Class 对象。
 
--------------------加载类
Java中有一个Class类用于代表某一个类的字节码。
Class类即然代表某个类的字节码,它当然就要提供加载某个类字节码的方法:forName()。forName方法用于加载某个类的字节码到内存中,并使用class对象进行封装
另外两种得到class对象的方式
•类名.class:  Manager.class;   int.class;  double[].class;
•对象.getClass()
 
----------------------解剖类
Class对象提供了如下常用方法:
Public  Constructor  getConstructor(Class<?>... parameterTypes)
Public  Method  getMethod(String name, Class<?>... parameterTypes)
Public  Field  getField(String name)   public
public Constructor getDeclaredConstructor(Class... parameterTypes)
public Method getDeclaredMethod(String name,Class... parameterTypes)
public Field getDeclaredField(String name)
这些方法分别用于从类中解剖出构造函数、方法和成员变量(属性)。解剖出的成员分别使用Constructor、 Method 、 Field 对象表示。
 
-----------------------利用 Constructor创建对象
Constructor类提供了如下方法,用于创建类的对象:
public Object newInstance(Object... initargs)
initargs用于指定构造函数接收的参数
 
---------------------------利用 Method执行方法
Method对象提供了如下方法,用于执行它所代表的方法:
public Object invoke(Object obj,Object... args
 
-----------------------------利用 Field访问属性
Field对象提供了如下方法,用于设置、获取对象属性的值:
public void set(Object obj,Object value)
public Object get(Object obj)

---------------------------------------------实例-----------------------------------------

属性类------------------------------------

package com.hbsi.reflection;

public class Person {
public String sex="nan";
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
private String name="zhangsan";
private int age;
public Person(){
//System.out.println("无参构造");
}
public Person(String name){
//this.name=name;
System.out.println(name);
}
public Person(String name,int age){
System.out.println(name+"..."+age);
}
private Person(int age){
System.out.println("私有");
}
public void run(){
System.out.println("run...");
}
public void run(String name){
System.out.println("run..."+name);
}
public void run(String name,int age){
System.out.println("run..."+name+"..."+age);
}
public int sum(int i,int j){
return i+j;
}
private void sum1(){
System.out.println("sum1...");
}
public static void sum2(){
System.out.println("sum2...");
}
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;
}
}
获取反射---------------------------------------------

package com.hbsi.reflection;

public class Demo1 {

public static void main(String[] args) throws ClassNotFoundException{
//1.forName()
Class clazz=Class.forName("com.hbsi.reflection.Person");
System.out.println(clazz.getName());
//2.
Class clazz1=Person.class;
System.out.println(clazz1.getName());
//3
Person p=new Person();
Class clazz2=p.getClass();
System.out.println(clazz2.getName());

Class clazz3=Integer.class;
System.out.println(clazz3.getName());
}
}
获取属性类的各种构造方法--------------------

package com.hbsi.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

import org.junit.Test;

public class Demo2 {
//反射出无参的构造方法,并创建一个person对象
@Test
public void test1() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException{
//加载类
Class clazz=Class.forName("com.hbsi.reflection.Person");
//反射出构造方法
Constructor c=clazz.getConstructor(null);
Person p=(Person)c.newInstance(null);
System.out.println(p.getName());
}
//反射出 public Person(String name)
@Test
public void test2() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException{
//加载类
Class clazz=Class.forName("com.hbsi.reflection.Person");
//反射出构造方法
Constructor c=clazz.getConstructor(String.class);
Person p=(Person)c.newInstance("lisi");
System.out.println(p.getName());
}
//反射出public Person(String name,int age)
@Test
public void test3() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException{
//加载类
Class clazz=Class.forName("com.hbsi.reflection.Person");
//反射出构造方法
Constructor c=clazz.getConstructor(String.class,int.class);
Person p=(Person)c.newInstance("lisi",23);
System.out.println(p.getName());
}
//反射private Person(int age)
@Test
public void test4() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException{
//加载类
Class clazz=Class.forName("com.hbsi.reflection.Person");
//反射出构造方法
Constructor c=clazz.getDeclaredConstructor(int.class);
c.setAccessible(true); //如果是private的,必须设置访问权限
Person p=(Person)c.newInstance(24);
System.out.println(p.getName());
}
@Test
public void test5() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
//加载类
Class clazz=Class.forName("com.hbsi.reflection.Person");
Person p=(Person)clazz.newInstance();
System.out.println(p.getName());
}
}
获取属性类的各种方法--------------------

package com.hbsi.reflection;

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

import org.junit.Test;

public class Demo3 {
// public void run()
@Test
public void test1() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
Person p=new Person();
Class clazz=Class.forName("com.hbsi.reflection.Person");
Method m=clazz.getMethod("run",null);
m.invoke(p,null);
}
//public void run(String name)
@Test
public void test2() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
Person p=new Person();
Class clazz=Class.forName("com.hbsi.reflection.Person");
Method m=clazz.getMethod("run",String.class);
m.invoke(p,"zhangsan");
}
//public int sum(int i,int j)
@Test
public void test3() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
Person p=new Person();
Class clazz=Class.forName("com.hbsi.reflection.Person");
Method m=clazz.getMethod("sum",int.class,int.class);
int value=(Integer)m.invoke(p,12,2);
System.out.println(value);
}
//private void sum1()
@Test
public void test4() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
Person p=new Person();
Class clazz=Class.forName("com.hbsi.reflection.Person");
Method m=clazz.getDeclaredMethod("sum1",null);
m.setAccessible(true);
m.invoke(p,null);
}
//public static void sum2()
@SuppressWarnings("unchecked")
@Test
public void test5() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
//Person p=new Person();
Class clazz=Class.forName("com.hbsi.reflection.Person");
Method m=clazz.getMethod("sum2",null);
m.invoke(null,null);
}
}
获取属性类的各种属性并赋值------------------------

package com.hbsi.reflection;

import java.lang.reflect.Field;

import org.junit.Test;

public class Demo4 {
@Test
public void test1() throws ClassNotFoundException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
Person p=new Person();
Class clazz=Class.forName("com.hbsi.reflection.Person");
Field f=clazz.getField("sex");
String sex=(String)f.get(p);
f.set(p, "nv");
//Class type=f.getType();
System.out.println(p.sex);
//System.out.println(type);
}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值