面向对象的编程思想
类 从很多对象中抽取处理的公用的特征行为 抽象描述 用来描述一组对象;
对象 现实生活中 先存在了好多对象 很多相同特征 相同行为
类是用来描述一组对象
反射机制认为是用来描述一组类
可以与之前学习File对比着学习
Class类 用来描述类本身
Package 用来描述类所属的包
Field 用来描述类中的属性
Method 用来描述类中的方法
Constructor 用来描述类中的构造方法
Annotation 用来描述类中的注解@Override 注解可以放置在(类上面 属性上面 方法上面 构造方法前 参数前 )
一.如何获取Class?
方式1:Class a=Class.forName("包名.类名");
方式2:Class a=类名.class;
方式3:通过对象的引用 Class a=对象.getClass();//Object类中的方法
二.Class中的常用方法
1.int n=a.getModifiers();获取类的修饰符(权限 特征)
2.String aa=a.getName();获取名字(包名.类名)
3.String ab=a.getSimpleName();简单名 (类名)
4.Package p=a.getPackage();
p.getName();//获取包名
5.Class m=a.getSuperClass();//获取超类(父类);
6.Class[] mm=a.getInterfaces();//获取类的父接口;
7.Object i=a.newInstance();//默认调用无参数的构造方法创建对象;
8.Field f=a.getField("属性名");公有的,自己类+父类
Field[] fs=f.getFields();//只能获取公有的属性,继承的也算
9.Field=getDeclaredField("属性");自己类(公有+私有)
Field[] fs=getDeclaredFields();//可以获取公有和私有的属性 只能获取本类中的属性
10.Class[] =getClasses();//获取类中的内部类(public)
三.Field类中的常用方法
int i=f.getModifers();//获取属性修饰符(权限+特征)
Class ni=f.getType();//获取属性的类型
String nn=f.getName();//获取属性的名字
操作属性 往里面存/取值;如果是私有属性不能直接操作的
setAccessable(true);//设置一个使用权 准入
set(对象,值) ;给属性赋值
Object=get(对象)从某个对象内取得属性的值;
package test0606; public class Animal{ }
package test0606; public class Person extends Animal{ }
package test0606; public class TestMain{ public static void main(String[] args){ try{ //通过一个Class对象来操作Person.class类文件 Class a=Class.forName("test0606.Person"); //类自己有结构 权限修饰符 特征修饰符 类名字 继承 实现 int i=a.getModifiers();//每一个修饰符 用一个整数来进行表示 System.out.println(i); String name=a.getName(); String sname=a.getSimpleName(); System.out.println(name+"---"+sname); Package p=a.getPackage(); System.out.println(p.getName());//获取包名 Class ax=a.getSuperclass();//获取父类; System.out.println("==="+ax.getName()); }catch(Exception e){ e.printStackTrace(); } } }
package test0606; import java.util.*; public class TestMain{ public static void main(String[] args){ //ArrayList<String> a=new ArrayList<String>(); Class m=ArrayList.class; Class pm=m.getSuperclass(); while(pm!=null){ System.out.println(pm.getName()); pm=pm.getSuperclass(); } } }
package test0606; import java.util.*; public class TestMain{ public static void main(String[] args){ //ArrayList<String> a=new ArrayList<String>(); Class m=ArrayList.class; Class[] pm=m.getInterfaces(); for(Class c:pm){ System.out.println(c.getName()); } } }
--------------------------------------------------------------------------------------------
package test0606; public class Animal{ public String names; private int ages; }
package test0606; public class Person extends Animal{ public String name; private int age; public String toString(){ return "{name:"+name+","+"age:"+age+"}"; } }
package test0606; import java.util.*; import java.lang.reflect.Field; public class TestMain{ public static void main(String[] args){ try{ Class a=Class.forName("test0606.Person"); //Person p=new Person(); Person p=(Person)a.newInstance(); Field[] fds=a.getFields();//public的,继承的也算; System.out.println(fds.length); Field fp=a.getDeclaredField("age");//私有age System.out.println("fp:"+fp); fp.setAccessible(true);//表示私有属性可以直接被操作; fp.set(p,20); Integer value=(Integer)fp.get(p);//取值 System.out.println(value); //System.out.println("p:"+p); /* //通过a获取类中的属性; Field n=a.getField("name");//属性名我知道;属性是public n.set(p,"画画"); System.out.println(p); String name=(String)n.get(p); System.out.println(name); */ /* int num=a.getModifiers();//属性修饰符; System.out.println(num); Class fc=n.getType();//获取属性的类型 System.out.println(fc.getName()); System.out.println("++"+n.getName());//获取属性名字 */ //System.out.println( //Person p=(Person)a.newInstance();//相当于调用Person类的无参数构造方法 //System.out.println(p); }catch(Exception e){ e.printStackTrace(); } } }
---------------------------------------------------------------------------
修改字符串的值;
package test0606; import java.lang.reflect.Field; public class TestMain{ public static void main(String[] args) throws Exception{ String a="abc"; System.out.println(a);//abc //反射的技术可以获取私有属性 可以操作私有属性 //1.获取String类对应的那个class Class cs=a.getClass(); Field fd=cs.getDeclaredField("value");//2.获取类中的属性; //3.直接操作属性的值不可以 设置私有属性可以被操作 fd.setAccessible(true); //获取value属性里面的值(内存地址); char[] temp=(char[])fd.get(a); //通过temp的地址引用 找到真实String对象中的数组 修改数组中的每一个元素 temp[0]='爱'; temp[1]='1'; temp[2]='2'; System.out.println(a);//爱12 } }