java的反射机制

    平时的编程中并不会用到反射, 但是在编写框架的时候,反射用的就多了,比如你要使用某一个类进行操作,但是这个类是用户通过配置文件配置进来的,你需要先读配置文件,然后拿到这个类的全类名:比如com.xx.Person,然后在利用反射API来做操作, 反射能让程序更加灵活;

  可以利用三种方式,获取Class的实例, 第一种方式: Class.forName是用的是最多的

package org.nono.getClassName;
class X{
public String name = "nono";
}
public class getClassDemo {
public static void main(String args[]) {
Class<?> c = null;
Class<?> c1 = null;
Class<?> c2 = null;
X x = new X();
try{
c = Class.forName("org.nono.getClassName.X");
}catch(Exception e) {
e.printStackTrace();
}
c1 = X.class;
c2 = x.getClass();
System.out.println(c);
System.out.println(c1);
System.out.println(c2);
}
}

 

  利用反射实现的实例化对象, 使用反射实例化对象时候, 最好必须存在一个无参的构造方法, 否则使用class.newInstance();会报错;

class Demo {
public String name = "";
public void setName (String name) {
this.name = name;
}
}
public class InstanceDemo {
public static void main(String args[]) {
Class<?> c = null;
try{
c = Class.forName("Demo");
Demo demo = (Demo)c.newInstance();
demo.setName("hehe");
System.out.println(demo.name);
}catch(Exception e) {
e.printStackTrace();
}
}
}

 

  如果在实际开发中必须使用有参构造的方式实例化对象, 必须引用java.lang.reflect.Constructor类:

import java.lang.reflect.*;
class Demo {
public String name = "";
public Demo(String name) {
this.name = name;
}
public void setName (String name) {
this.name = name;
}
}
public class InstanceDemo {
public static void main(String args[]) {
Class<?> c = null;
try{
c = Class.forName("Demo");
Constructor ct[] = null;
ct = c.getConstructors();
Demo demo = (Demo)ct[0].newInstance("hehe");
System.out.println(demo.name);
}catch(Exception e) {
e.printStackTrace();
}
}
}

 

  java的反射让java更加灵活了,利用反射, 只要知道构造函数的名字,就能直接实例化方法, 能够优化代码:

interface Fruit{
public String name="";
}
abstract class FruitName implements Fruit{
public String name="";
public String getName() {
return this.name;
}
}
class Apple extends FruitName {
public String name = "apple";
}
class Pear extends FruitName {
public String name = "pear";
}
public class FactoryDemo{
public static void main(String args[]) {
Class<?> c = null;
Class<?> c1 = null;
try{
c = Class.forName("Apple");
c1 = Class.forName("Pear");
System.out.println(c.newInstance());
System.out.println(c1.newInstance());
}catch(Exception e) {
e.printStackTrace();
}
}
}

 

  常用的3个annotation

  java的annotation

import java.util.*;
class Demo{
public void print() {
System.out.println("DemoGet");
}
}
class SuperDemo<T> extends Demo{
private T t = null;
@Override
public void print() {
System.out.println("SuperDemoGet");
}
@Deprecated
public void show() {
System.out.println("Supershow");
}
public T get() {
return t;
}
public void set(T t) {
this.t = t;
}
}
public class AnnotationDemo {
@SuppressWarnings({"unchecked"/*,"override"*/,"deprecation"})
public static void main(String args[]) {
SuperDemo sd = new SuperDemo();
sd.show();
HashMap hm = new HashMap();
}
}

  @Override的RetentionPolicy作用范围是SOURCE, 只能在源程序中出现;

  @Deprecated的作用范围是在RUNTIME中, 在执行的时候也出现;

  @SuppressWarning的作用范围是SOURCE;

  

  自定义Annotation

  先写一个主方法:

@myAnno(name="hehe")
@myAnno1(arr={"1","2"})
public class AnnoDemo {
public static void main(String args[]) {

}
}

 

  自定义的Annotation   @myAnno

import java.lang.annotation.*;
@Retention(value=RetentionPolicy.RUNTIME)
public @interface myAnno {
public String name();
}

 

  自定义的Annotation   @myAnno1

import java.lang.annotation.*;
@Retention(value=RetentionPolicy.RUNTIME)
public @interface myAnno1 {
public String[] arr();
}

天道酬勤