package com.meituan.sample; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.meituan.sample.robusttest.other.Hll; import com.meituan.robust.patch.RobustModify; import com.meituan.robust.patch.annotaion.Add; import com.meituan.robust.patch.annotaion.Modify; import com.meituan.sample.robusttest.ConcreateClass; import com.meituan.sample.robusttest.People; import com.meituan.sample.robusttest.State; import com.meituan.sample.robusttest.Super; import java.lang.ref.WeakReference; import java.lang.reflect.Field; import java.util.Arrays; import java.util.List; public class SecondActivity extends AppCompatActivity implements View.OnClickListener { protected String flag = "flagstring"; protected static String name = "zhang"; public Hll hll = new Hll(true); private People people = new People(); public static State state = new State(new Hll(true)); private ListView listView; private String[] multiArr = {"列表1", "列表2", "列表3", "列表4"}; private String inlineToString(){ return super.toString(); } @Override @Modify protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); System.out.println(inlineToString()); setContentView(R.layout.activity_main2); listView = (ListView) findViewById(R.id.listview); //test lambda expression TextView textView = (TextView) findViewById(R.id.secondtext); textView.setOnClickListener(v -> { RobustModify.modify(); //test inner class accessibility people.setAddr("asdasd"); getInfo(state, new Super(), 1l); Log.d("robust", " onclick in Listener"); } ); //change text on the SecondActivity textView.setText(getTextInfo(name)); // belows are test!!,you may ignore // belows are test!!,you may ignore // belows are test!!,you may ignore // belows are test!!,you may ignore //test inner class new Handler().postDelayed(new PreloadWebviewRunnable(this), 1100); Log.d("robust", hll.getStrings(1, flag)); Log.d("robust", getString(R.string.app_name)); //test for static methods Log.d("robust", "getValue is " + getFieldValue("a", hll)); Log.d("robust", "==========" + getInfo(state, new Super(), 1L) + "============="); //test for bundle Bundle bundle=new Bundle(); bundle.putInt("asd",1); bundle.getFloat("asd"); //test array BaseAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_expandable_list_item_1, multiArr); listView.setAdapter(adapter); } /** * if you change the return value you will change the show text,in the demo we built a patch to change the text */ @Modify public String getTextInfo(String meituan) { People p = new People(); p.setName("mivazhang"); p.setCates(" AutoPatch"); people.setName(" I am Patch"); ConcreateClass concreateClass = new ConcreateClass(); getArray(meituan); //打开这部分注释,查看修复效果 // Arrays.fill(multiArr,"修复后的数据"); // return "修复后:you make it!! name is " + p.getName() + " \npatch success " + people.getName() ; return "error occur " + concreateClass.getA(); } @Add public String[] getArray(String meituan) { People p = new People(); p.setName("mivazhang"); return new String[]{p.getName(),"meituan"}; } // another usage of Modify anntation // @Modify(value = "com.meituan.sample.SecondActivity.onCreate(android.os.Bundle)") private String getInfo(State stae, Super s, long l) { String json = "[1,2,3,4,5]"; Gson gson = new Gson(); List<Integer> myObject = gson.fromJson(json, new TypeToken<List<Integer>>() { }.getType()); TextView textView = new TextView(this); textView.setOnClickListener(v -> { people.setAddr("getInfo "); Log.d("robust", " getInfo onclick in Listener"); } ); return "you make it!! " + getTextI1(flag) + myObject; } @Override public View onCreateView(String name, Context context, AttributeSet attrs) { return super.onCreateView(name, context, attrs); } @Add public State getTextI2(String baidu) { Bundle baseBundle = new Bundle(); baseBundle.get("asdas"); return new State(new Hll(false)); } public State getTextI1(String baidu) { Bundle baseBundle = new Bundle(); baseBundle.get("asdas"); return new State(new Hll(false)); } public static String[] methodWithArrayParameters(String[] flag) { return flag; } @Override public void onClick(View v) { Toast.makeText(SecondActivity.this, "from implements onclick ", Toast.LENGTH_SHORT).show(); } public static Field getReflectField(String name, Object instance) throws NoSuchFieldException { for (Class<?> clazz = instance.getClass(); clazz != null; clazz = clazz.getSuperclass()) { try { Field field = clazz.getDeclaredField(name); if (!field.isAccessible()) { field.setAccessible(true); } return field; } catch (NoSuchFieldException e) { // ignore and search next } } throw new NoSuchFieldException("Field " + name + " not found in " + instance.getClass()); } public static Object getFieldValue(String name, Object instance) { try { return getReflectField(name, instance).get(instance); } catch (Exception e) { Log.d("robust", "getField error " + name + " target " + instance); e.printStackTrace(); } return null; } class PreloadWebviewRunnable implements Runnable { WeakReference<SecondActivity> activityWeakReference; PreloadWebviewRunnable(SecondActivity activity) { activityWeakReference = new WeakReference<SecondActivity>(activity); } @Override public void run() { Toast.makeText(activityWeakReference.get(), "from PreloadWebviewRunnable PreloadWebviewRunnable ", Toast.LENGTH_SHORT).show(); } } class OP<T> { T a; T test(T p) { Object op[] = new Object[10]; op[1] = p; return (T) op; } } }