java 反 - 射

获取一个class所对应的Class有如下方法,每个class都有此getClass()方法
1.getClass()
  String str = "accp";
  Class c = str.getClass();
  System.out.println(c);
  //the result is : java.lang.String
  即字符串所对应的Class为java.lang.String
2 getSuperClass()
  获取指定类的父类所对应的Class
  如果你对一个Object类调用getSuperClass(),你觉得会返回什么呢?
  答案是: null
  因为Object已经是所有类的父类,没有比它更高的,你这么调用的话
  当然会返回null
3 Class.forName() 这个方法不陌生把
  其中的参数必须是完整的包名加类名
  Class.forName(java.lang.String); // return the Class of java.lang.String
4 .class 语法
   起基本用法为: 类名+ ".class",返回此类所对应的Class
   Class c1 = String.class;
   Class c2 = int[].class; //因为数组也是引用类型
   Class c3 = float.class; //原生类型也是可以的
5  原生数据类型的包装类

   Class c1 = Boolean.TYPE;
   Class c2 = Integer.TYPE;
   Class c3 = Float.TYPE;
   所有原生类型都可以用".TYPE"这种形式得到其对应的Class
   当然用前面的方法也是可以的哦~
   这5种方法说的差不多了把
   我们再来看看如何在得到Class后,来生成特定类的实例

   如果构造函数的参数为空,则可以用如下方法获取其实例
   Student是一个类,有一个睡觉的方法 sleep()   其有个参数为空的构造方法
  A: Class c = Class.forName("Student");
   Student s = (Student) c.newInstance();
   s.sleep();
   我们可以用另一种写法,一样的效果,嘎嘎
  B: Class c = Class.forName("Student");
   Object obj = null ;
   obj = c.newInstance(); //newInstance()方法返回的是Object类型
   Student s = (Student) obj ;
   s.sleep();

   这样通过反射就可以得到实例

上面是针对没有参数的构造函数,如果有参数呢?
我们假设Student类有一个构造函数:Student(String name,Integer age);
Class c = Class.forName("Student"); //首先还是一样,获取类的Class
Class[] params = new Class[]{String.TYPE,Integer.TYPE}; //这两个参数对应构造函数中的那2个参数 
Constructor ctor = c.getConstructor(params);  //根据参数获取一个Constructor对象
Student s = (Student) ctor.newInstance(new Object[]{"admin",22});  这样我们仍然可以得到Student的一个实例
s.sleep();

  前面所说的是针对类的实例
  下面来说说针对方法以及方法中的属性的例子
   public String run(String name){
     return name+"在听音乐。。。。。。" ;
   }
  方法:
  Class c = Class.forName("Student");
  Class params[] = new Class[]{String.TYPE};
  Method m = c.getMethod("run","admin"); //第一个方法为指定类中的哪个方法的实例,第二个参数为此方法中的参数
  Student stu = new Student () ;
  String r = (String)m.invoke(stu,params); //第一个参数为调用哪个类的对象,第二个参数为此方法中的参数
  此方法返回指定方法的返回值
  System.out.println(r); //打印出来就是:admin在听音乐。。。。。。

  运行时生成属性对象
  我们的Student类有一个属性为String name
  Class c = Class.forName("Student");
  Field f = c.getField("name");
  Student s = new Student();
  System.out.println(f.get(s)); //取值
  f.set(s,"admin"); //存值 
   

--------------------------------------------------------------

 

反射取得属性:

protected void test( Object entity) throws IllegalArgumentException, IllegalAccessException {

Field[] fs = entity.getClass().getDeclaredFields(); // 取得属性
///////////////////fs[0].setAccessible(fs, true);  //设置所的属性都可读写
for (Field f : fs) {
   if (f.getType().equals(java.lang.String.class)) {
    f.setAccessible(true); // 设置true,可以读写
    f.set(entity, "accp"); // 重新给值
    System.out.println(f.get(entity)); // 获取属性
   }
  }
 }

///方法 Field  getDeclaredField(String name):返回已加载类声明的所有成员变量的Field对象,不包括从父类继承的成员变量,参数name指定成员变量的名称.

你可能感兴趣的:(java,C++,c,C#,音乐)