黑马程序员---反射,Class类,Method类,Field类,数组参数的成员方法


---------------------- android培训java培训、期待与您交流! ----------------------

反射的基石——Class

如何得到字节码文件的实例对象?

有三种方式:

类名.class 如:System.class

对象.getClass() 如:new Date().getClass();

Class.forName(" 类名") 如:Class.forName(" java.util.Date");

代码:

package com.hncu.day1;

import java.util.Date;


public class GetClass  {

	public static void main(String[] args) throws Exception{
		Class c1 = Date.class;//Date类的字节码文件 他是一个Class类型的实例对象,
		GetClass gc = new GetClass();
		gc.getClass();
		
		System.out.println(gc.getClass());
		System.out.println(c1);
		System.out.println(Class.forName("com.hncu.day1.GetClass"));
	}

}


 

数组类型的Class实例对象:

Class.isArray();

System.out.println(int[].class.isArray());//true

反射:

就是把java中的各种成分映射成相应的java类。

一个类中的组成成分:成员变量,方法,构造方法,包等信息,也用一个个的java类来表示。

一个类中的的每个成员都已用相应的反射API类的一个实力对象来表示,通过调用Class累的方法可以得到这些实例对象后,得到实例对象后怎么用是学习反射的要点.

Constructor类代表某个类的一个构造方法。

得到某个类的所有构造方法:

Constructor[] constructor = Class.forName("java.lang.String").getConstructor();

得到某一个构造方法:

Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);//得到StringBuffer类的构造函数

实例对象:

普通方式:String str = new String( new StringBuffer("abc"));

反射方式:

Constructor constructor = String.class.getConstructor(StringBuffer.class);

String str = (String)constructor.newInstance(new StringBuffer("abc"));

Filed 

Filed 类代表某个类中的一个成员变量。

import java.lang.reflect.Field;

public class ReflectDemo {
	private int x;
	public int y;

	public ReflectDemo(int x, int y) {
		this.x = x;
		this.y = y;
	}

	public static void main(String[] args) throws Exception {
		ReflectDemo rd = new ReflectDemo(3, 8);
		ReflectDemo rd1 = new ReflectDemo(4, 9);
		
		Field fieldX = rd.getClass().getDeclaredField("x");// 得到类中私有x的定义。
		Field fieldY = rd.getClass().getField("y");// 得到类中y的定义。

		System.out.println(fieldY.get(rd));// 得到rd对象y的值
		System.out.println(fieldY.get(rd1));// 得到rd1对象的y值

		
		fieldX.setAccessible(true);// 将fieldX设置为可见。
		System.out.println(fieldX.get(rd));// 得到rd对象中x的值
	}
}


 

利用反射获取String 类型的成员变量后,修改字符串中的字符。

import java.lang.reflect.Field;

public class ReflectDemo {

	Private String str1 = "reflect";
	Private String str2 = "reflectdemo";

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

		ReflectDemo rd = new ReflectDemo();
		changeValue(rd);
	}

	private static void changeValue(Object obj) throws Exception {
		Field[] fields = obj.getClass().getDeclaredFields();//获取所有定义的成员变量
		for (Field field : fields) {
			if (field.getType() == String.class) {// 字节码使用== 使用的是一份字节码
				String oldValue = (String) field.get(obj);
				String newValue = oldValue.replace('r', 'R');
				field.set(obj, newValue);
			}
		}
		System.out.println(obj);
	}

	// 重写toString方法
	public String toString() {
		return str1 + " " + str2;
	}
}


 

Method

代表某个类中的一个成员方法

得到类中的一个方法:

:Class.forName("java.lang.String").getMethod("charAt",int.class)

调用方法:

ü 普通方式:

str对象来调用,str.charAt(1);

ü 反射方式:

Method m =String.class.getMethod("charAt"int.class);

System.out.println(m.invoke(str1, 1));//为str1这个对象调用charAt方法参数为1,打印“r”,Str1 这个对象要用静态修饰。

如果invoke方法的第一个参数为null ,表示该Method对象对应的是一个静态方法。

 

 

(重点理解)接受数组参数的成员方法进行反射:

import java.lang.reflect.Method;

 public class ReflectDemo2 {

	public static void main(String[] args) throws Exception {
		String startClassName = args[0];
		Method mainMethod = Class.forName(startClassName).getMethod("main", String[].class);
		mainMethod.invoke(null,new Object[]{new String[]{"hncu","nihao"}});
		//ReflectTest.maint(new String[]{"dkj","kdfj"});
		
	}

}
  class ReflectTest {
	 public static void main(String[] args) {
		 for(String s : args) {
			 System.out.println(s);
		 }
	 }
 }


 

打印结果:

hncu
nihao

 

---------------------- android培训java培训、期待与您交流! ---------------------- 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值