/*
* 定义用于操作的属性和方法
*/
public class ChangeStringValue {
private int x;
public int y;
public String str1="asbbdfsf";
public String str2="gfdbgsaa";
public String str3="gfgf";
public ChangeStringValue(int x, int y) {
super();
this.x = x;
this.y = y;
}
@Override
public String toString() {
return str1+":"+str2+":"+str3;
}
}
public class Test {
/**
* 接收字段的成员属性与接收数组参数的成员方法的进行反射
*/
public static void main(String[] args) throws Exception {
ChangeStringValue p1=new ChangeStringValue(3, 5);
Field fieldy=p1.getClass().getField("y"); //获取变量名为y的字节码文件
//field不是对象身上的变量,而是类身上
System.out.println(fieldy.get(p1)); //获取字节码里面的元素并打印
Field fieldx=p1.getClass().getDeclaredField("x");//获取私有变量名为x的字节码文件
fieldx.setAccessible(true); //为了使x变量不隐藏要把field设置为true;
System.out.println(fieldx.get(p1));//获取字节码里面的元素
changeStringValue(p1);
System.out.println(p1);
//接收数组参数的成员方法进行反射
String string="asdfc";
Method methedCharAt=String.class.getMethod("charAt", int.class); //获取参数的截取方法
System.out.println(methedCharAt.invoke(string, 1)); //方法调用方法进行截取字符串中下标为1个字符
System.out.println(methedCharAt.invoke(string, new Object[]{2})); //截取字符串中下标为2的字符
String stringName=args[0]; //字符串数组长度为一
Method mainMethod=Class.forName(stringName).getMethod("main", String[].class);//获取Class stringClassName类中“main”
mainMethod.invoke(null, (Object)new String[]{"123","321","dsa"}); //methed方法调用invoke方法传参
//(Object)new String[]{"123","321","dsa"}这里的String数组被转换为Object中的一个元素
}
//接收字段成员属性为String类型进行反射
private static void changeStringValue(Object obj)throws Exception {
Field [] fields=obj.getClass().getFields(); //获取obj的class字节码文件存入数组
for(Field f:fields){
if(f.getType()==String.class){ //如果该字段为String类型
String oldValue=(String) f.get(obj); //将obj转换为String类型
String newValue=oldValue.replace('b', 'a'); //替换字符
f.set(obj, newValue);//重新赋值给obj
}
}
int []x1=new int[3];
int []x2=new int[4];
int [][]x3=new int[2][3];
String []x4=new String[3];
System.out.println(x1.getClass().getName()==x2.getClass().getName()); //如果是同一类型的数组,并且维数相同那么得到的字节码是同一份;
System.out.println(x1.getClass().getName()==x3.getClass().getName());
System.out.println(x1.getClass().getName()==x4.getClass().getName());
System.out.println(x1.getClass().getName()); //获取字节码的名称
System.out.println(x1.getClass().getSuperclass().getName());//打印x1的父类名称
System.out.println(x4.getClass().getSuperclass().getName());
Object objx1=x1; //int类型的数组是Object
Object objx2=x4;
//Object[] objx3=x1; //1维数组不是Object数组
Object []objx4=x3; //2维数组是Object数组
Object []objx5=x4; //String类型的数组是Object
Object objs=null;
printObject("asdm");
printObject(fields);
}
private static void printObject(Object objs) {
Class class1=objs.getClass(); //获取字节码文件
if(class1.isArray()){ //如果是数组
int len= Array.getLength(objs); //获取数组长度
for (int i = 0; i < len; i++) {
System.out.println(Array.get(objs, i)); //分行打印数组
}
}else{
System.out.println(objs);
}
}
}
class stringClassName{
public static void main(String[] args) {
for(String s:args){ //高级for循环
System.out.println(s);
}
}
}